modglue-1.8/0000700000077000007700000000000010623023006012354 5ustar kantorkantormodglue-1.8/AUTHORS0000600000077000007700000000005407126135555013446 0ustar kantorkantorKasper Peeters, modglue-1.8/ChangeLog0000600000077000007700000000206610601745120014140 0ustar kantorkantor2007-03-26 Kasper Peeters * Released 1.8 * Added static building of ptywrap. 2007-03-05 Kasper Peeters * Released 1.7 * Fixed linking with -lutil and selection of pty.h or util.h for Mac OS X systems (should now work on 10.3.x and 10.4.x). 2007-02-20 Kasper Peeters * Removed pty opening code in ptywrap with openpty for increased compatbility with e.g. Red Hat systems. 2007-02-19 Kasper Peeters * Released 1.6. * Added "wait()" to the child_process class. * Fixed a problem in ptywrap which would prevent it from ever ending properly on Mac OS X. * Released 1.5. * Enabled ptywrap for Mac OS X. 2007-02-15 Kasper Peeters * Released 1.4. * Made ptywrap compile on Mac OS X. 2007-02-06 Kasper Peeters * Released 1.3. * Added proper versioning support using -version-info rather than the -release system. 2006-08-18 Kasper Peeters * Added support for Mac OS X. * Version 1.2 released. modglue-1.8/configure0000700000077000007700000040203410573032540014275 0ustar kantorkantor#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # # Copyright (C) 2003 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 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+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; 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 # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. 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 ;; 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 { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # 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'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="src/shell.cc" ac_default_prefix=/usr/local # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX LN_S SET_MAKE CPP EGREP PKG_CONFIG ac_pt_PKG_CONFIG sigc_CFLAGS sigc_LIBS MAC_OS_X USE_UTIL_H LINK_UTIL LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # 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. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= 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 ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -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 | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$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 ;; -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 ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) 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 ;; -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=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 ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && 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'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac 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 echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # 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 its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | 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 if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP ac_env_PKG_CONFIG_set=${PKG_CONFIG+set} ac_env_PKG_CONFIG_value=$PKG_CONFIG ac_cv_env_PKG_CONFIG_set=${PKG_CONFIG+set} ac_cv_env_PKG_CONFIG_value=$PKG_CONFIG ac_env_sigc_CFLAGS_set=${sigc_CFLAGS+set} ac_env_sigc_CFLAGS_value=$sigc_CFLAGS ac_cv_env_sigc_CFLAGS_set=${sigc_CFLAGS+set} ac_cv_env_sigc_CFLAGS_value=$sigc_CFLAGS ac_env_sigc_LIBS_set=${sigc_LIBS+set} ac_env_sigc_LIBS_value=$sigc_LIBS ac_cv_env_sigc_LIBS_set=${sigc_LIBS+set} ac_cv_env_sigc_LIBS_value=$sigc_LIBS # # 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 this package 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 \`..'] _ACEOF cat <<_ACEOF 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] --datadir=DIR read-only architecture-independent data [PREFIX/share] --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] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF 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 CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility sigc_CFLAGS C compiler flags for sigc, overriding pkg-config sigc_LIBS linker flags for sigc, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style 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 elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd "$ac_popdir" done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF Copyright (C) 2003 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 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { 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` hostinfo = `(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=. echo "PATH: $as_dir" done } >&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_sep= 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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >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 # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 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 `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 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 { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu 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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC 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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" 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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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_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" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done 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 echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl 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 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out 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. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$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 echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 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 -std1. */ int osf4_cc_array ['\x00' == 0 ? 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 # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext 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 ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h 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 echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi MAC_OS_X="" if test "`uname`" == "Darwin" then MAC_OS_X="1" echo "checking system type... Darwin" else echo "checking system type... Unix" fi USE_UTIL_H=1 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 echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } 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 echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #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)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF 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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in util.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------ ## ## Report this to the AC_PACKAGE_NAME lists. ## ## ------------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "${ac_cv_header_util_h}" == "no" then USE_UTIL_H=0 fi LINK_UTIL="" echo "$as_me:$LINENO: checking for openpty in -lutil" >&5 echo $ECHO_N "checking for openpty in -lutil... $ECHO_C" >&6 if test "${ac_cv_lib_util_openpty+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lutil $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char openpty (); int main () { openpty (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_util_openpty=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_util_openpty=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_util_openpty" >&5 echo "${ECHO_T}$ac_cv_lib_util_openpty" >&6 if test $ac_cv_lib_util_openpty = yes; then LINK_UTIL="-lutil" fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PKG_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 echo "${ECHO_T}$PKG_CONFIG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5 echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi PKG_CONFIG=$ac_pt_PKG_CONFIG else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5 echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6 if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 PKG_CONFIG="" fi fi pkg_failed=no echo "$as_me:$LINENO: checking for sigc" >&5 echo $ECHO_N "checking for sigc... $ECHO_C" >&6 if test -n "$PKG_CONFIG"; then if test -n "$sigc_CFLAGS"; then pkg_cv_sigc_CFLAGS="$sigc_CFLAGS" else if test -n "$PKG_CONFIG" && \ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"sigc++-2.0\"") >&5 ($PKG_CONFIG --exists --print-errors "sigc++-2.0") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_sigc_CFLAGS=`$PKG_CONFIG --cflags "sigc++-2.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$sigc_LIBS"; then pkg_cv_sigc_LIBS="$sigc_LIBS" else if test -n "$PKG_CONFIG" && \ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"sigc++-2.0\"") >&5 ($PKG_CONFIG --exists --print-errors "sigc++-2.0") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_sigc_LIBS=`$PKG_CONFIG --libs "sigc++-2.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then sigc_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "sigc++-2.0"` else sigc_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "sigc++-2.0"` fi # Put the nasty error message in config.log where it belongs echo "$sigc_PKG_ERRORS" >&5 { { echo "$as_me:$LINENO: error: Package requirements (sigc++-2.0) were not met: $sigc_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables sigc_CFLAGS and sigc_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&5 echo "$as_me: error: Package requirements (sigc++-2.0) were not met: $sigc_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables sigc_CFLAGS and sigc_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&2;} { (exit 1); exit 1; }; } elif test $pkg_failed = untried; then { { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables sigc_CFLAGS and sigc_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." >&5 echo "$as_me: error: The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables sigc_CFLAGS and sigc_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else sigc_CFLAGS=$pkg_cv_sigc_CFLAGS sigc_LIBS=$pkg_cv_sigc_LIBS echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 : fi ac_config_files="$ac_config_files Makefile modglue.pc src/Makefile examples/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, don't put newlines in cache variables' values. # 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. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *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 \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" 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}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # 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+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; 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 # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # 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 # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. 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 ;; 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 { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # 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'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -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 --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; 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 if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "modglue.pc" ) CONFIG_FILES="$CONFIG_FILES modglue.pc" ;; "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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 fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@LN_S@,$LN_S,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@CPP@,$CPP,;t t s,@EGREP@,$EGREP,;t t s,@PKG_CONFIG@,$PKG_CONFIG,;t t s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t s,@sigc_CFLAGS@,$sigc_CFLAGS,;t t s,@sigc_LIBS@,$sigc_LIBS,;t t s,@MAC_OS_X@,$MAC_OS_X,;t t s,@USE_UTIL_H@,$USE_UTIL_H,;t t s,@LINK_UTIL@,$LINK_UTIL,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac # 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. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # 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 || { (exit 1); exit 1; } fi modglue-1.8/configure.in0000600000077000007700000000165110573032540014701 0ustar kantorkantordnl Process this file with autoconf to produce a configure script. AC_INIT(src/shell.cc) dnl Variable overrides dnl PACKAGE=modglue dnl VERSION=0.9 dnl AC_SUBST(PACKAGE) dnl AC_SUBST(VERSION) dnl Checks for programs. AC_PROG_CC AC_PROG_CXX AC_PROG_LN_S AC_PROG_MAKE_SET dnl AC_PROG_LIBTOOL dnl Checks for libraries. dnl Checks for header files. MAC_OS_X="" if test "`uname`" == "Darwin" then MAC_OS_X="1" echo "checking system type... Darwin" else echo "checking system type... Unix" fi AC_PREFIX_DEFAULT(/usr/local) USE_UTIL_H=1 AC_CHECK_HEADERS(util.h) if test "${ac_cv_header_util_h}" == "no" then USE_UTIL_H=0 fi LINK_UTIL="" AC_CHECK_LIB(util,openpty, [LINK_UTIL="-lutil"]) PKG_CHECK_MODULES([sigc], [sigc++-2.0]) dnl AC_SUBST(install_flags) AC_SUBST([MAC_OS_X]) AC_SUBST([USE_UTIL_H]) AC_SUBST([LINK_UTIL]) dnl The output files AC_OUTPUT( Makefile modglue.pc src/Makefile examples/Makefile ) modglue-1.8/COPYING0000600000077000007700000004310507126135555013435 0ustar kantorkantor GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. modglue-1.8/doc/0000700000077000007700000000000010574264351013140 5ustar kantorkantormodglue-1.8/doc/index.html0000600000077000007700000000606610574264351015147 0ustar kantorkantor libModglue: a C++ library for handling co-processes

libModglue: a C++ library for handling co-processes

Kasper Peeters, kasper.peeters (at) aei.mpg.de

Overview

The libModglue library is a C++ library with classes for forking external processes and asynchronous reading from streams. It takes away the burden of all subtleties involving the Unix fork call. The asynchronous read facility enables one to read on multiple input streams at the same time, without loosing any of the standard C++ stream facilities.
There are also several small additional programs bundled with modglue, such as a program to add readline capability to any command line program. Moreover, the modglue library extends the idea of standard Unix pipes by providing a general framework for the creation of new processes with more than just the standard stdin/stdout/stderr pipes.

Simple example

#include <modglue/modglue.hh>

modglue::pipe foopipe("foo", modglue::pipe::input,  0);
modglue::pipe barpipe("bar", modglue::pipe::output, 1);

void print(const string& txt)
   {
   cout << "received " << txt << " on foo pipe" << endl;
   cout << "sending something on bar pipe" << endl;
   while(txt!="end") {
      string str;
      if(!foopipe.read(str,2))
         break;
      }
   barpipe.sender("thank you!");
   }

int main(int argc, char **argv) 
   {
   modglue::main mm(&argc, &argv);

   mm.add(pipe1);
   mm.add(pipe2);

   foopipe.receiver.connect(slot(print));
   
   mm.run();
   }

Utilities

Several small programs are bundled with modglue. They provide some additional functionality that was easy to implement with the library, or are generally useful for command-line driven programs.
ptywrap (modglue executable)

Starts a program with stdin/stdout/stderr connected to a pseudo tty device, and map them to fd 0,1,2. This can be used to trick programs like ftp or sed into thinking that they are running interactively.
> ptywrap [unix executable]
is all you need to know.

prompt (modglue executable)

The prompt utility wraps other programs such that their input has the well-known readline behaviour. In other words, you can use the cursor keys for editing, there is a history, and so on. Useful for programs like ftp that lack this functionality.



$Id: index.html,v 1.38 2007/03/08 16:57:25 peekas Exp $ modglue-1.8/doc/message.hh0000600000077000007700000000150607240353036015104 0ustar kantorkantor > new window(-1,-1,600,800); < 1945 > new button("kasper"); < 1946 > 1945->add(1946); > new canvas(); < 1947 > 1945->add(1947); { 1946.pressed { 1947.redraw(0,0,680,800); > 1947.draw_string(100,100,"test"); > 1947.set_color("red"); > 1947.draw_box(120,0,125,800); or for XML xml_in> blabla

foo

barbar bar command> new iterator(top); out> 1945 command> 1945.print(); out> html command> 1945.num_children(); out> 1 command> 1945.next_child(); command> 1945.print(); out> body command> 1945.type(); out> element cycling through input-pipes by pressing shift-tab. class object { public: string name; int reference; }; class message { public: enum message_type { new_type, delete_type, call_type, reference_type, signal_type }; int reference(); }; modglue-1.8/doc/oldindex.html0000600000077000007700000004716110573116004015635 0ustar kantorkantor modglue documentation

modglue

a
Plan9-inspired extension of the Unix pipe concept

Kasper Peeters, <K.Peeters@damtp.cam.ac.uk>

[overview] [download] [library] [shell overview] [shell manual] [utilities] [faq]

WARNING: Modglue is in an experimental stage right now. It may not even compile. The text below does not necessarily reflect the status of the code.

Overview

Modglue is a combination of several software tools that assist in writing and running programs connected to each other using standard Unix pipes. There are two main parts to it, the modglue library and the modglue shell. In more detail:
modglue library
This is a C++ library with classes for forking external processes and asynchronous reading from streams. It takes away the burden of all subtleties involving the Unix fork call. The asynchronous read facility enables one to read on multiple input streams at the same time, without loosing any of the standard C++ stream facilities.
modglue shell
A shell with special support for arbitrarily connecting process pipes together, in a way that goes beyond the standard Unix linear pipe idea (a bit like ksh co-processes, but much more powerful). In contrast to existing shells, you can start any number of processes and connect their stdin/stderr/stdout pipes in any way you like, not just linear as usual.
Each of these is explained in more detail below. There are also several small additional programs bundled with modglue, such as a program to add readline capability to any command line program.

Moreover, the modglue library extends the idea of standard Unix pipes by providing a general framework for the creation of new processes with more input or output pipes. The modglue library has support for this built in, but the setup is general and can be used from any language.

In general, the idea behind modglue is that the Unix pipe concept is very powerful, but insufficient to construct interactive programs that require bidirectional communication between processes. The library and shell extend this concept in a completely backwards compatible way such that large robust systems can be built from individual Unix building blocks.

The idea of "circularly connected pipes" is not new, but usually only implemented in an ad-hoc fashion. See for instance satshell, which is a gui tool which reads gui building commands from stdin and writes event information (pressed buttons and so forth) to stdout. In this case, the satshell program itself is given a program to which it should connect its stdin and stdout. For another similar idea (though without implementation), see this Freshmeat editorial by David Symonds. Modglue separates the connection logic from the actual program (in the context of satshell, the gui tool would be one process and the script another, and modglue would connect their stdin/stdout pipes in a circular way).

Once Unix building blocks are more easily connected in order to build complex programs, one can perhaps start building graphical tools to do this (an example of this approach, though with custom building blocks instead of programs that stick to the Unix pipe philosophy, can be found in triana).


Download and install

You need the following additional software in order to compile and use modglue:

Then, download and install modglue.tar.gz. Follow the instructions in the INSTALL file for installation details.


Modglue library

#include <modglue/modglue.hh>

modglue::pipe foopipe("foo", modglue::pipe::input,  0);
modglue::pipe barpipe("bar", modglue::pipe::output, 1);

void print(const string& txt)
   {
   cout << "received " << txt << " on foo pipe" << endl;
   cout << "sending something on bar pipe" << endl;
   while(txt!="end") {
      string str;
      if(!foopipe.read(str,2))
         break;
      }
   barpipe.sender("thank you!");
   }

int main(int argc, char **argv) 
   {
   modglue::main mm(&argc, &argv);

   mm.add(pipe1);
   mm.add(pipe2);

   foopipe.receiver.connect(slot(print));
   
   mm.run();
   }


Modglue shell overview

On Unix systems, the standard way to combine small programs into bigger ones is to tie them together using pipes. As all standard conforming programs have three standard pipes (stdin, stdout, stderr) open, it is easy to feed the output of one program into another one:
wget -O - http://somewhere | grep "something"
However, this way of connecting programs is limited in the sense that data only flows one way (from the first program to the second and so on, but never back).

Some shells have ways to circumvent this limitation. The korn shell has so-called "co-processes", which you can start as

program |&
after which you can read from and write to the standard pipes. A similar concept exists in zsh, where co-processes are started by pre-fixing them with the command "coproc". Although very useful, these shells only allow for a single co-process.

Moreover, there is no standard way to extend the number of input/output pipes that a program can have. (co-processes do not allow for input redirection to startup arguments; since many programs can only take their arguments from argv and not from stdin, this is (unfortunately) a requirement. Also, these guys do not provide a pseudo-tty so most programs started as coprocesses will start buffering).

The modglue library takes the Unix concept one step further and allows programs to open more than these three standard pipes. Furthermore, the links between programs can be more flexible (you can have complicated graph-like structures instead of just a single linear pipe) and writing programs that listen on multiple pipes in a non-blocking way is considerably easier. For instance, a program could be prompting the user with a dialog for entering a url, then send that request out through its output pipe, and read in any responses through its input pipe.

The modglue library implements a strict superset of the standard Unix pipe idea: all normal Unix programs can be used as modglue building blocks, the only limitation being that these programs of course have only the three standard pipes.

There are two types of programs in the modglue world: unix executables and modglue executables. The second category is a strict superset of the first one; all modglue executables are also unix executables, though they may not be able to offer full functionality when run from a unix shell instead of the modglue shell.


Modglue shell user manual

Modshell is the analogue of a normal unix shell like bash or csh. It contains the logic to tie sockets of various modglue executables together and spawn new processes. However, it is intended to be usable as a replacement for a normal Unix shell, in the sense that running programs in the normal Unix way is supported (with the standard notation, eg. using the '&' character to start programs in the background and the '|' character to connect stdout/stdin of programs). In more detail, the options are:
start programs immediately
This is like starting programs on a Unix shell. Just type the command (followed by its arguments, if any) and press return. You will not get a prompt back before the program returns. The stdin/stdout/stderr sockets of the program will be connected to the stdin/stdout/stderr sockets of the modshell.

If you try to start Unix executables this way, they will automatically be wrapped using the "ptywrap" command.

start programs in the background
This is again like starting programs on a Unix shell. Just type the command (followed by its arguments, if any) followed by a '&' character and press return. Any output will be buffered, but in contrast to the situation in Unix, you can connect the stdout/stderr (or any socket, for that matter) of the running program even after the program has been started.

list all running and runnable programs
Type the command "jobs". This produces a list of the following form:
> jobs
13446 running                       xbiff
                                      xbiff::stdin
                                      xbiff::stdout
                                      xbiff::stderr
13447 running                       gtkiowin
                                      gtkiowin::stdin
                                      gktiowin::stdexc
13558 standby, start_on_input       wget -O -
                                      wget::stdin
                                      wget::stdout
                                      wget::stderr

list all socket connections
Type the command "bonds". This produces a list of the all connections between sockets of different executables.

add programs to the runnable list
Type the program name, and append a '^' character. This will not start the program yet, so that you can still connect its socket to those of other programs (see the "connect" command).

Options can be given by adding them in a comma separated list after the '^' character. At the moment, the available ones are start_on_input and abort_on_failed_write.

start programs in the runnable list
Type "[pid] &" where `pid' is the process identifier of a process in the runnable list. This is similar to the way suspended unix binaries are restarted in the background in normal unix shells.

connect sockets of different programs
Type "connect" followed by a space-separated list of the sockets of the programs which you want to connect.

There is a shortcut possible if you just want to connect in the normal Unix way (connect stdout and/or stderr of one program to stdin of the next): just type the program names separated by a pipe symbol '|'.


Utilities

Several small programs are bundled with modglue. They provide some additional functionality that was easy to implement with the library, or are generally useful for command-line driven programs.
ptywrap (modglue executable)

Starts a program with stdin/stdout/stderr connected to a pseudo tty device, and map them to fd 0,1,2. This can be used to trick programs like ftp or sed into thinking that they are running interactively.
> ptywrap [unix executable]
is all you need to know.

prompt (modglue executable)

The prompt utility wraps other programs such that their input has the well-known readline behaviour. In other words, you can use the cursor keys for editing, there is a history, and so on. Useful for programs like ftp that lack this functionality.


Frequently asked questions

What about threads?
An initial implemention of modglue supported loading modglue executables as threads. This was, however, extremely ugly. Studying Plan9 I have come to the conclusion that for almost all tasks it is better to redesign modules (divide the functionality differently) in such a way that they can each run in individual address spaces. Careful use of the select loop facilities of modglue is the right way to go.

How does it compare to DCOP, CORBA, XML-RPC and so on?
What sets modglue apart from other mechanisms to build software using independent components are its compatibility with the Unix pipe system, the idea of a shell determining which connections to make (instead of modules determining themselves to which other module they want to connect) and its simplicity. Among the other available systems, there is DCOP (used in KDE, has a special non-ascii communication method that is incompatible with Unix pipes, modules make explicit requests for services instead of leaving that to the shell), CORBA and XML-RPC.

Some of the functionality of modglue can be found in TCL, in particular the ability to send data to the stdin of an already forked program. Modglue aims for a much more basic goal: it just links programs together, nothing more. In this sense it is a lot simpler than TCL (and it feels more like a normal Unix shell).

Sockets are bidirectional, so why are all modglue pipes still uni-directional?
Even though modglue uses sockets for all communication between processes, the pipes are always either reading or writing pipes, but not both. This is done to mimick as closely as possible the Unix pipe idea, which uses unidirectional communication (you cannot write to stdin, for instance).

The `other' component of the socket channel is used solely for status information, and never directly visible to the user of the program. These status messages are suppressed when modglue binaries run in Unix mode, so they do not interfere with normal expected Unix pipe behaviour.

What names should I give to my pipes?
Even though you have the option of giving arbitrary names to programs, it pays off to think about this for a little while. If the program is small enough and the program name itself describes its function, just using stdin, stdout and stderr can be a good choice.

In case your program is going to write explicit requests for data on a pipe and then listen for the reply on another one, it is good to make the names related. Suggested are reqout and reqret and variations thereof if you need more than one pair.

How does message tagging work?
Since the sendmsg and recvmsg system calls can cut up and re-assemble the messages in arbitrary ways, modglue provides an alternative mechanism to make sure that the messages you send are only processed at the other end when all the data has arrived. The way in which this works is that all data is encapsulated in the following structure before it is handed to sendmsg:
fieldsize (bytes
version number and flags1
stream identifier8
length4
datalength
The reader will then be able to figure out whether to wait for more messages to come which really belong to the same outgoing message.

See the next question for info about the stream identifier field.

Obviously this header yields some overhead, and makes it clear that you should try to avoid sending only a few bytes of data. Compared to something like XML-RPC, the cost is still pretty minimal though.

How can I make asynchronous requests for data? (asynchronous remote procedure calls)
If you send a message using the normal sender member of a pipe, it will be stamped with a system wide unique identifier (see the table above). It is, however, possible to send a message with the identifier of a previously received message, such that it becomes possible to relate a number of messages into one `stream'.

Making an asynchronous request then goes as follows. Create a message with a new identifier, and store the identifier somewhere. When input comes in, compare its identifier to what was stored. If they match, it is a reply.

What about synchronous (blocking) reads or send/read?
There are no facilities for this, because it very easily leads to deadlocks. If your reading process blocks, waiting for data, then it blocks everything, including reading from other channels.

If you never block but instead use the main event loop to wait for incoming data, you avoid all potential deadlock situations. Just think differently.

How does modglue compare to notification messaging systems like Elvin?
The idea of notification systems is always that various programs send messages out, and other programs can decide to subscribe to these messages (based on the content). The Plan9 plumbing concept is similar in spirit.

In modglue, the user who starts processes decides which pipes it is going to listen to. This puts a little bit more burden on the user, but removes altogether a complicated layer of message distribution algorithms. Modglue is thus simpler, at the expense of needing a user willing to do a little bit more work.

Is it fast enough?
Obviously, you cannot expect a few thousand small read/writes from one process to the other to be anywhere near as fast as the same number of direct function calls in a linked library. Therefore, it pays off to think about how to group your data into big chunks if you want to have maximum speed.



$Id: oldindex.html,v 1.1 2007/03/05 22:39:00 peekas Exp $ modglue-1.8/doc/streams.html0000600000077000007700000000274607335536736015531 0ustar kantorkantor overflow: This function is called on output, when there is no buffer, or no space in the existing buffer. If you want buffering, the buffer should be set up in the first call to overflow. The argument is the character to be output, or EOF. For historical reasons, it is probably advisable to call sync on EOF. The exact functionality of this function will depend on the buffering strategy used. Without buffering, just output the argument, returning the character output, or EOF on error. With buffering: if there is no buffer, create one, otherwise flush it, and insert the character into the buffer. (Use the function setp to initialize the buffer, or to reset it to empty once you've flushed it, and the functions gptr and egptr to get the current values.) underflow: This function is called on input, which is a little more complicated. In particular, although the function returns the next character in the stream, it does *not* extract it from the stream. Input *must* be buffered, although a one character buffer is sufficient. Also, there is no guarantee that the get buffer will be empty when this function is called, so you have to check that. In all cases, when you return, 1) the next character must be present in the buffer -- if there wasn't a buffer before, you have to create one, and 2) that character must be returned. modglue-1.8/examples/0000700000077000007700000000000010606653733014213 5ustar kantorkantormodglue-1.8/examples/fetcher0000700000077000007700000000116707206004567015563 0ustar kantorkantor#!/bin/sh src/gtkshell \ --module='sed -e "s/\(.*\)/\1 -O -/"' \ --id=sed \ --module='grep HTML' \ --id=grep \ --module='wget' \ --options=start_on_input \ --module='src/gtkiowin' \ --id=viewer \ --module='src/gtkiowin' \ --options=start_on_input \ --id=error_output \ --module='examples/periodic "Type a URL in the box above."' \ --options=abort_on_failed_write \ --bond=sed:stdout,wget:startup_args \ --bond=sed:stdin,viewer:stdout \ --bond=wget:stdout,grep:stdin \ --bond=grep:stdout,viewer:stdin \ --bond=examples/periodic:stdout,viewer:stdexc \ $* # --bond=wget:stderr,error_output:stdexc \ modglue-1.8/examples/Makefile.in0000600000077000007700000000113410534761222016252 0ustar kantorkantor all: periodic multi_io use_wget #periodic_modglue #multi_io %.o: %.cc @CXX@ @CFLAGS@ -I@top_srcdir@/include `pkg-config modglue --cflags` -c -o $@ $< use_wget: use_wget.o @CXX@ -o use_wget -L../src `pkg-config modglue --libs` use_wget.o multi_io: multi_io.o @CXX@ -o multi_io -L../src `pkg-config modglue --libs` multi_io.o -lmodglue periodic: periodic.o @CXX@ -o periodic -L../src periodic.o periodic_modglue: periodic_modglue.o @CXX@ -o periodic_modglue -L../src periodic_modglue.o -lmodglue install: clean: rm -f *.o *~ multi_io periodic periodic_modglue distclean: rm -f Makefile modglue-1.8/examples/multi_io.cc0000600000077000007700000000165210403767244016347 0ustar kantorkantor /* Simple program to show usage of multiple I/O pipes in addition to the standard stdin/stdout/stderr combo. */ #include #include #include #include using namespace std; modglue::ipipe foopipe("foo"); modglue::ipipe foo2pipe("foo2"); modglue::opipe barpipe("bar"); bool print(modglue::ipipe& p) { string txt; while(p >> txt) { cerr << "from foo: |" << txt << "|" << endl; barpipe << "bar:" << txt << endl; } p.clear(); return true; } bool print2(modglue::ipipe& p) { string txt; while(p >> txt) { barpipe << "thank you 2!" << endl; } p.clear(); return true; } int main(int argc, char **argv) { modglue::main mm(argc, argv); mm.add(&foopipe,0); mm.add(&foo2pipe); mm.add(&barpipe,2); foopipe.receiver.connect(sigc::ptr_fun(print)); foo2pipe.receiver.connect(sigc::ptr_fun(print2)); mm.run(2); } modglue-1.8/examples/periodic.cc0000600000077000007700000000067507270543712016330 0ustar kantorkantor #include #include #include #include int main(int argc, char **argv) { int counter=1; char buffer[100]; while(true) { if(argc>1) { if(write(1, argv[1], strlen(argv[1])) #include #include #include #include #include modglue::pipe *foopipe; main(int argc, char **argv) { modglue::main *mm=modglue::loader::instance().create_main(argc, argv); foopipe=new modglue::pipe("stdout", modglue::pipe::output); mm->add(foopipe); if(mm->check()) { int counter=1; char buffer[100]; while(true) { sprintf(buffer, "test %d\n", counter); foopipe->sender(buffer); ++counter; sleep(1); } } } modglue-1.8/examples/recursive0000700000077000007700000000035407177244665016163 0ustar kantorkantor#!/bin/sh src/gtkshell \ --module='src/gtkshell' \ --module='src/gtkiowin' \ --bond=src/gtkshell:inforeq,src/gtkiowin:stdout \ --bond=src/gtkshell:infodump,src/gtkiowin:stdin \ --bond=src/gtkshell:fddump,src/gtkiowin:stdexc \ $* modglue-1.8/examples/simple0000700000077000007700000000047107154514561015433 0ustar kantorkantor#!/bin/sh gtkshell \ --module='src/gtkiowin' \ --module='examples/periodic_modglue' \ --options=abort_on_failed_write \ --module='examples/periodic' \ --options=abort_on_failed_write \ --bond=src/gtkiowin:stdexc,examples/periodic_modglue:foo \ --bond=src/gtkiowin:stdin,examples/periodic:stdout \ $* modglue-1.8/examples/simple1.cc0000600000077000007700000000001307126414656016072 0ustar kantorkantor /* */ modglue-1.8/examples/simple2.cc0000600000077000007700000000001307126414656016073 0ustar kantorkantor /* */ modglue-1.8/examples/use_wget0000700000077000007700000103406210403767274015772 0ustar kantorkantorELF8‘4ô4 (&#44€4€444€€„"„"„"„²„²Ð„œ"œ²œ²ððHHH PåtdPPŸPŸ\\Qåtd/lib/ld-linux.so.2GNU%621$ 5+03 &%#."!4 )('* /- ,0OKë}#”HŸ!p œ²ñÿS¤q²i™ ha0H¼<®¹X´!‚*^Iîu°Ž –Ï ]`´Œ—‰ÐLŸ!ôíÑñT´ñÿ¡ŠØï7Ùý_!äž g‡lHï˜TêT´ñÿ'³ñÿýµñÿÝÎi_A£ÈÎ5ÉŸvø&ð´= 4=Å7*£Q libsigc-2.0.so.0_DYNAMIC_init_fini_GLOBAL_OFFSET_TABLE__Jv_RegisterClasses__gmon_start__libmodglue.so.0_ZNK7modglue11ext_process9exit_codeEv_ZN7modglue4mainC1EiPPc_ZN7modglue11ext_processC1ERKSs_ZN7modglue11ext_processlsERKSs_ZN7modglue11ext_processC1ERKS0__ZN7modglue11ext_process11setup_pipesEv_ZN7modglue4main3addEPNS_11ext_processE_ZNK7modglue11ext_process10input_pipeERKSs_ZN4sigc9trackableC2Ev_ZN4sigc9slot_baseC2EPNS_8internal8slot_repE_ZN4sigc11signal_base7connectERKNS_9slot_baseE_ZN4sigc9slot_baseD2Ev_ZN7modglue11ext_process4forkEv_ZN7modglue4main3runEi_ZN7modglue11ext_processD1Ev_ZN7modglue4mainD1Ev_ZN4sigc9trackableD2Ev_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE_ZNSt15basic_streambufIwSt11char_traitsIwEE13_S_pback_sizeElibstdc++.so.5_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc_ZNSolsEl_ZSt4cerr_ZNSolsEm_ZNSolsEPFRSoS_E_ZdlPv__cxa_end_catch_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4___gxx_personality_v0_ZTISt9exception_ZNSs20_S_empty_rep_storageE_ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc_ZNSt8ios_base4InitC1Ev_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6__ZNSsC1EPKcRKSaIcE_ZNSt8ios_base4InitD1Ev__cxa_begin_catch_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6__Znwj_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate_ZNSs4_Rep10_M_destroyERKSaIcElibm.so.6libgcc_s.so.1_Unwind_Resumelibc.so.6__cxa_atexit_IO_stdin_used__libc_start_main_edata__bss_start_endGCC_3.0GLIBC_2.0GLIBC_2.1.3CXXABI_1.2GLIBCPP_3.2• P&y ²0ii  si  Ò¯k r)+Œ³5X´`´ð´0œ³ ³¤³¨³¬³°³´³ ¸³ ¼³ À³ ij ȳ̳гÔ³سܳà³ä³è³ì³ð³ô³ø³ü³ ´!´#´$ ´%´)´*´+´, ´-$´/(´2,´30´4U‰åƒìè¡èüèûÉÃÿ5”³ÿ%˜³ÿ%œ³héàÿÿÿÿ% ³héÐÿÿÿÿ%¤³héÀÿÿÿÿ%¨³hé°ÿÿÿÿ%¬³h é ÿÿÿÿ%°³h(éÿÿÿÿ%´³h0é€ÿÿÿÿ%¸³h8épÿÿÿÿ%¼³h@é`ÿÿÿÿ%À³hHéPÿÿÿÿ%ijhPé@ÿÿÿÿ%ȳhXé0ÿÿÿÿ%̳h`é ÿÿÿÿ%гhhéÿÿÿÿ%Ô³hpéÿÿÿÿ%سhxéðþÿÿÿ%ܳh€éàþÿÿÿ%à³hˆéÐþÿÿÿ%ä³héÀþÿÿÿ%è³h˜é°þÿÿÿ%ì³h é þÿÿÿ%ð³h¨éþÿÿÿ%ô³h°é€þÿÿÿ%ø³h¸épþÿÿÿ%ü³hÀé`þÿÿÿ%´hÈéPþÿÿÿ%´hÐé@þÿÿÿ%´hØé0þÿÿÿ% ´hàé þÿÿÿ%´hèéþÿÿÿ%´hðéþÿÿÿ%´høéðýÿÿÿ%´héàýÿÿÿ% ´héÐýÿÿÿ%$´héÀýÿÿÿ%(´hé°ýÿÿÿ%,´h é ýÿÿÿ%0´h(éýÿÿ1í^‰áƒäðPTRh|žh4žQVh ”èïþÿÿôU‰åSè[Ã+"P‹ƒüÿÿÿ…ÀtÿЋ]üÉÃU‰åƒì€=µu)¡<´‹…Òt‰öƒÀ£<´ÿÒ¡<´‹…ÒuëƵÉÉöU‰åƒì¡˜²…Àt¸…Àtƒì h˜²ÿЃÄvÉÃU‰åWVSƒì,‹uðƒø´ÇEØü´^}؃ìj ‹F‹PôPè»üÿÿƒÄ ¾ÀPWSèýÿÿ‹BôƒÄö@u…Àũìj‹pôVèýÿÿ‹UØJô]ȸÿÿÿÿðÁBü…À~ eô[^¸_ÉÃìSQè þÿÿƒÄëä‹U؉ÃJôuȸÿÿÿÿðÁBü…À~ ƒì Sè6þÿÿƒìVQèÜýÿÿƒÄëè‰öU‰åWVSƒì,‹uðƒø´ÇEØü´^}؃ìj ‹F‹PôPèïûÿÿƒÄ ¾ÀPWSèQüÿÿ‹BôƒÄö@u…Àũìhøƒì hŸh`´èµüÿÿƒÄPèüûÿÿXZj‹pôVè-üÿÿ‹UØJô]ȸÿÿÿÿðÁBü…À~ eô[^¸_ÉÃìSQèýÿÿƒÄëä‰ö‹U؉ÃJôuȸÿÿÿÿðÁBü…À~ ƒì SèFýÿÿƒìVQèìüÿÿƒÄëè‰öU‰åSƒì h Ÿh`´èüÿÿZÿu‰ÃèCûÿÿ‰Â‹‹@ôƒÀ‹DƒÄ¨@u¨t"ƒìRSèüÿÿY[h˜Pè3ûÿÿ¸‹]üÉÃìRSèûÿÿëÜU‰åWVSì\ƒäðQÿu ÿu…èüÿÿPèšûÿÿµxüÿÿƒÄ VhŸˆüÿÿSèïúÿÿXZS…˜üÿÿPè0ûÿÿ‹•ˆüÿÿƒÄJô½hüÿÿ¸ÿÿÿÿðÁBü…ÀŽ`PWhŸSè¯úÿÿƒÄ VhŸµXüÿÿVèšúÿÿYXV…˜üÿÿPè üÿÿYZSPèüÿÿ‹•XüÿÿƒÄJô¸ÿÿÿÿðÁBü…ÀŽî‹•ˆüÿÿJô¸ÿÿÿÿðÁBü…ÀŽ»ƒì…˜üÿÿP…øûÿÿPè³úÿÿƒÄ …HüÿÿPhŸVèúÿÿXZV…øûÿÿPèûÿÿ‹•XüÿÿƒÄJô¸ÿÿÿÿðÁBü…ÀŽQƒì …øûÿÿPè²úÿÿY[…øûÿÿP…èüÿÿPèíúÿÿƒÄ …HüÿÿPh:ŸVè¸ùÿÿXZV…øûÿÿPè9ûÿÿX Ç$ èŠûÿÿ‰ÇÆ…›ûÿÿ‰$è‰úÿÿYXGÇ@è‘ÇGÇG œÇG XœÇGÇGP…¤ûÿÿP‰½¤ûÿÿèÛXZW…ØûÿÿPÆ…›ûÿÿè!úÿÿ‹…ØûÿÿÇ@ØœƒÄ …ØûÿÿPS…ÈûÿÿPè½úÿÿ‹…Èûÿÿ‰…èûÿÿ…ØûÿÿPè%úÿÿ‹•XüÿÿƒÄJô¸ÿÿÿÿðÁBü…ÀŽP…HüÿÿPhAŸVèÄøÿÿ_XV…øûÿÿPèEúÿÿX Ç$ è–úÿÿ‰ÇÆ…šûÿÿ‰$è•ùÿÿY^GÇ@´’ÇGÇG œÇG XœÇGÇGP… ûÿÿP‰½ ûÿÿèçXZW…ØûÿÿPÆ…šûÿÿè-ùÿÿ‹…ØûÿÿÇ@ØœƒÄ …ØûÿÿPS…ÈûÿÿPèÉùÿÿ‹…Èûÿÿ‰…èûÿÿ…ØûÿÿPè1ùÿÿ‹•XüÿÿƒÄJô¸ÿÿÿÿðÁBü…ÀŽƒì j èÉùÿÿ‰ÇÆ…™ûÿÿ‰$èÈøÿÿ^XGÇ@¤“ÇGÇGðœÇG <ÇGÇGP…œûÿÿP‰½œûÿÿè:Y[W…¨ûÿÿPÆ…™ûÿÿè`øÿÿ‹…¨ûÿÿÇ@¼ƒÄ …¨ûÿÿP…èüÿÿP…Èûÿÿ¸ûÿÿPèðøÿÿ‹…Èûÿÿ‰…¨ûÿÿPè\øÿÿ…øûÿÿ‰$èÞ÷ÿÿXZj…èüÿÿPèÞøÿÿ…øûÿÿ‰$è°öÿÿƒÄƒì …˜üÿÿPèžöÿÿ…èüÿÿ‰$è÷ÿÿƒÄeô[^1À_ÉÃì…HüÿÿPQèøÿÿƒÄéØþÿÿƒì…HüÿÿPQèû÷ÿÿƒÄéÌýÿÿvƒìWQèæ÷ÿÿƒÄéüÿÿƒì…HüÿÿPQèÎ÷ÿÿƒÄé-üÿÿƒì…HüÿÿPQè¶÷ÿÿƒÄéúûÿÿ‰öƒìWQè¢÷ÿÿƒÄéŽûÿÿ‰ö‹•ˆüÿÿ‰ÃJôµhüÿÿ¸ÿÿÿÿðÁBü…À~ƒì …èüÿÿPè9öÿÿ‰$è±÷ÿÿƒìVQèW÷ÿÿvƒÄë×v‰ÃëЋ•Xüÿÿ‰ÃJôµHüÿÿ¸ÿÿÿÿðÁBü…À~7‹•ˆüÿÿJô¸ÿÿÿÿðÁBü…À~ƒì …˜üÿÿPècõÿÿë­ƒìVQè÷öÿÿƒÄëàƒìVQèèöÿÿƒÄëºv‰ÃµHüÿÿë­‰ö‰Ã뾉֋•Xüÿÿ‰ÃJô¸ÿÿÿÿðÁBü…À~Qƒì …øûÿÿPèõÿÿƒÄNuŽƒì Sè·öÿÿ^_h˜ƒì‹PÿRY[Ph`´èÊõÿÿƒÄPèõÿÿƒÄèÉõÿÿéþÿÿƒìWQèZöÿÿƒÄ렉ÉÖ뙉ËG…À‰Öt ƒì WÿЃÄƒì Wè¡ôÿÿƒÄƒì Wè5õÿÿƒÄ‹•XüÿÿJô¸ÿÿÿÿðÁBü…ÀRÿÿÿƒì…HüÿÿP뛉ÉÖ뻉Éր½›ûÿÿtÆë¸‰Ãƒì …ØûÿÿP‰Öè³õÿÿ묉ÉÖë¨éqÿÿÿ‰Ã‹G…À‰Öt€ƒì WÿÐérÿÿÿ‰Ã‰Ö€½šûÿÿë¸ëÐéGÿÿÿ‰Ã‹G…À‰Öt ƒì WÿЃÄƒì WèîóÿÿƒÄƒì Wè‚ôÿÿéÿÿÿ‰Ã‰Öëà€½™ûÿÿ‰Ã‰Ö„¡þÿÿëÙ‰Ãƒì …¨ûÿÿP‰Öè!õÿÿéâþÿÿ‰Ã‰Öéþÿÿ‰ÃèŒôÿÿéþÿÿ‰öU‰åƒì} ÿÿtÉÃvƒ}uõƒì hµèôÿÿƒÄ h8´jh¤›èÙóÿÿƒÄëÏU‰åÇEµÉédõÿÿU‰åƒìhÿÿjèžÿÿÿƒÄÉÃU‰åƒì‹E‹‰Eüÿu EüPèîƒÄÉÃU‰åƒì‹E‹‰Eüÿu EüPèÞƒÄÉÃU‰åƒì‹EÇ@Ç@‰EüƒÀPEüPè1ÀÉÃU‰åƒì‹E‹‰Eüÿu EüP袃ÄÉÃU‰åWVSƒìj ‹}è½ôÿÿ‰Æ‹_‰$èÀóÿÿX‹GZ‹W‰FF‰^ÇF œÇF XœÇFÇF‰VPEðP‰uðèÿÿÿƒÄeô[‰ð^_ÉÉöƒì ‰ÃVèÉòÿÿ‰$èôÿÿU‰åƒìÿu ‹EÿP¶ÀƒÄÉÃU‰åƒì‹EÇ@Ç@‰EüƒÀPEüPè1ÀÉÃU‰åƒì‹E‹‰Eüÿu EüPè΃ÄÉÃU‰åWVSƒìj ‹}èÙóÿÿ‰Æ‹_‰$èÜòÿÿYX‹G‹W‰FF‰^ÇFðœÇF <ÇFÇF‰VPEðP‰uðèSþÿÿƒÄeô[‰ð^_ÉÉöƒì ‰ÃVèåñÿÿ‰$èóÿÿU‰åƒìÿu ‹EÿP¶ÀƒÄÉÃU‰åƒE Éé3U‰åƒE Éé+U‰åƒE Éé#U‰åƒE ÉéU‰åÉÃU‰åÉÃU‰åÉÃU‰åÉÃU‰åWVSƒì è[ÃNèbðÿÿ“ôþÿÿ‹ôþÿÿ)Ê1öÁú9Ös‰×ÿ”³ôþÿÿF9þrôƒÄ [^_ÉÃU‰åVSè[à ‹ôþÿÿƒôþÿÿ)ÁÁù…Éqÿu è:[^ÉÉöÿ”³ôþÿÿ‰òN…ÒuòëåU‰åSR¡ˆ²ƒøÿ»ˆ²t ƒëÿЋƒøÿuôX[ÉÃU‰åSè[ãRè†òÿÿ‹]üÉÃ.exit code:wget--Ohttp://www.ictp.trieste.itstdoutstderr;X ˜òÿÿxdóÿÿ¤TôÿÿÔ¼ôÿÿøüÿÿ8düÿÿèýÿÿXˆýÿÿ€ìýÿÿ lþÿÿÈzPL| ˆ( è‘É\¡A…B Fƒ†‡g. N.,L´’íj¡A…B Fƒ†‡g. N.l.I. |¤“hA…B DƒJ.<  ”Ux¡A…B Iƒ†‡Q.Õ.K.I.H.O...àd›@A…B _.$Xœd¢A…B Fƒ†‡E.(ØœA…B I.$H<t¢A…B Fƒ†‡E.p¼A…B I.´›A…B J.ÿÿ 05˜µÿÿ 0W¼ÙÿèÝ8° Gä x¨ œ œ´ ôÀ‰¨ ˜¬ Ũ ï² þ¬ ž‡ à® ö‡ š– ²¬ ãÜ òÚ ’Í Ô· êÍ Ž– ¦Ú Ψ ß•¡á ·•ç¨û#¨ §À¹° Ç– ý ɽ  Æ  ð }X´ÿÿ lzÿÿ lzÿÿÿÿ´›ÿÿÿÿ` ‹•² °Ž äžh<†Ü‚ 7 ³0€` þÿÿoàŒÿÿÿoðÿÿotŒœ²ÞŽîŽþŽ.>N^n~Žž®¾ÎÞîþ.>N^n~Žž®¾ÎÞîþ‘‘.‘”²MODGLUE_1.0_BINARYGCC: (GNU) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)GCC: (GNU) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)GCC: (GNU) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)GCC: (GNU) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)GCC: (GNU) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)GCC: (GNU) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)¬è‘ã Ì›ì› œ+8œXœØœðœ+<¼Ô ä ô ž žž$ž,žt èÂreceive_html3’receive_infox“receive_exitstatus«mainA´visit_each_type > >tµvisit_each_type > >v¶sigc::internal::typed_slot_rep >::destroy²¶visit_each_type > >Ó·sigc::internal::typed_slot_rep >::dup¹sigc::internal::slot_call1, bool, modglue::ipipe&>::call_it’¹sigc::internal::typed_slot_rep >::destroyιvisit_each_type > >úsigc::internal::typed_slot_rep >::dupø»sigc::internal::slot_call1, bool, modglue::ext_process&>::call_itR¼visit_each, sigc::pointer_functor1 >˜¼visit_each, sigc::pointer_functor1 > ½visit_each, sigc::pointer_functor1 >S½visit_each, sigc::pointer_functor1 >™½visit_each, sigc::pointer_functor1 >ݽvisit_each, sigc::pointer_functor1 >!¾visit_each, sigc::pointer_functor1 >e¾visit_each, sigc::pointer_functor1 >4Àstd::_Swap_lock_struct<0>::_S_swap_locköÁstd::basic_streambuf >::_S_pback_sizeÂstd::basic_streambuf >::_S_pback_sizeäÂÉéX1ö§—,intNÑÕ>÷à߆Ët²™ß#"#4y“##8Ÿ²$#<ö:'#@·¡sM¼AG M φËG M †ËG ïü ï ÷à‹ö q, // ï 5:D EESEy(GÐ"n; 7×# í$>îZ%–òà‹;(¨= ú¾)nk„*Å0 ´d+ €…,,D->&x2ø‹:U3 íàåZ;ø ¦< Ž ˆ ø7‰> ½Š>ÑY‹–tùŒ Šñ>ÓøŽ>‘Iì:øx‘,È’§ È’–Ë’ #._0§å¡s! 'ü._0! '._0! , 裏-§ó“8¾”–6†• è–>Q@—tK˜>Nn™m÷›,~ÔœµÛ,”| ,“9£,IѦ/«È®¬øÁy¯–—p° C ³–"´ Š¬¶,bÞº†Ìr»$¼5:çë¿,ðvÂ>Y .\7U ”  ,#C* 5#­ý 5#”; 5# ›M 5#y 5#ߺ 5# p 5#”¬ 5# © 5#$žá 5#(Ö@ 5#,P* #0á £#4¬| ,#8$ #,#<à %t#@T ) #DO *¨#Fø* +Y#GL— /i#H¯8 8†#Lég ;Ê#T(N <H#X A,#\N) Co#`¡sû3£ … 'U £ … U £)o>\™eb>¹TY*¹MÇZN,#ÒPòéQBždR*¬¡s:@ FÃ._2@ F._2@Ss#._1Y¡sQW ]._1W ]._1W :: ïssLsYYcYÙ÷såÙ÷ drt#ZýY#._3s¿¡såë ñÖ._3ë ñ._3ëss÷s¥#y¥ dr!†#Zý"Y#._4S¡sy …j._4 …._4‹†þH›¡Ó, Ó ÿ É Ï Ú æ , ,Ùÿ {`<t¹Þuú #‹çv/#^ x,#:~z5# ÈT{5#,L}#Ķ~ì # #«¾€1 # ¸ „,#$œÌ…,#(€!†,#,3‡,#0›Š,#47;Œ #8× ¡sN" Ó  ï {`Ó  {`Ó É €´$’òá“à #ö+”à #Å$˜,#cœ,# ³× ,#— ¢W#Zý£Y#ò¾§Ý # ¡ ¡s"‹ ÿ   ¹ €´ÿ   €´ÿ Ï Õ nà n3IK÷ ý  B Ó n±@N " 1 , ÓÛ±O< B M Óö,XX ^  , Ó ÿ Ï É Ï Ú æ I] £ Æ , Ï Ï à à ÕôaÑ × ð , / ð æ ö /Kçd  ! , ! /  +e2 8 C Ý hÚ-jM #•çk’ #ôOl' #7;m # ünÝ #µ ¡s¥ã Ý  é Í Ý  é Ý C C ï C RÔô Ù Ù     ‡­²L®3#ýK¯Ó#7;°  #x ¡s)P¯ µ  » ‡µ  » ‡µ  ¯  ï" " Á " €±µ ä…5Ü ­ä…,.GV/" X,1GV2" #7;3 #2¡s­³ ¹I._8³ ¹._8³©4ó ._7Ü ‡¡sÄÊ Ðž._7Ê Ð._7Êó ó ¿ó Ü Ü ÖÜ g7Å,„8,8Â9 B<:>© +:!!L ­¡N ³ã@ ´# µ£#er ¹,#u¡s¬.© ¯ ¡N ¯ ¡N\µ"ß^• È#f1#²9#7¥#!d¿ægx Ó‹ ÔÐ#Æ6 Ú&#I° ÝO#Ϻ â“# >C ã¨#ÃI ä¨#x; æÑ#!¹ ç¨#úr éÜ # ±w êÜ #L—¡sõ­×Ê Ý ¯ægÊ Ý ægÊÊ Êß¿º Ê W    5 5 tí5ÖOº Ê W 5 5 ,‡º Ê W / / ö ‡ ‡ ‡U¨, Ê™Ñ, Ê W / / >®ßãß!%N¼ ïC* ð‡#­ý ñ‡#”; ò‡#›M ó‡# y ô‡#ߺ õ‡# p ö‡#”¬ ÷‡#© ù‡# žá ú‡#$Ö@ ü‡#(P þY#,3 ÿY#4ég ß#<ø* !#´@a 7#¸ù¡sÏÝBH N %NH N %NH 1 ïÇ}=1èèTè i: ï : ï3\‹\Íì _œµ 5 >" hÁÚ / >ô¸ pæÿ, ÿ ,†©ž s , Œë x1” yµ^ zÚ¬¶ {{­ „\ï{­ )6 €ï#.÷ õ#ㆠ‚û#ÎÏ ƒ# ._9\É¡s  à._9  ._9 µÚ\\\­ …\#©MÜ÷Xs¨^»å« wþ x^#RÏ y#“¡s|h»Á Ç «å«Á Ç å«ÁKKÍK4ÚX ?èe @,# ¡s4: @ $ÚX: @ ÚX:ÒÒFÒ­ØX Tèe U,#…¡sY*­³ ¹ ØX³ ¹ ØX³KK¿Koý b–ª6 lÚ>ª6€ jz( k>#$š…Ú¡sNT Z%/š…T Z&š…T NÄ ïÚÚ`Úó <2S@ L^–| \ •9 h«'|tm, „t† …,#Ž †,#¢ ‡,#¿e ˆ,# 95 ‰,#ô Š,#L­ ‹,#àˆ Œ,#F« ,# ‘Ï #$±6 ‘/#(V¡sýë|‚ ˆ(mtm‚ ˆ)tm‚‘‘Ž‘  „ü ¡K#¤  ¢K#Û¡sa5   ó    “““z ¬‘Qc ,bª ;Ÿbª€ –Ë Ÿ#$Ž©;y¡s¯µ »%Ž©µ »&Ž©µ ¯– ï;;Á;dª2;A"~”M#àM,#¡sšÐAG M 1"~G M "~GÑÑSÑçŠ#ci›¥AÕ$*å8+,#ì9,,#üG-K#&Y.,# :i/,#ûµ03#bý1,#Ò}2 #I 33# ¡s}OAG M 1ÕG M ÕGooSouH4oáb:øFy0@Q0AÑ#?êBX#‹îD# „cEc#($Á…yá¡s #%øÁ… #&Á… : ïyy)yþÉM9þÉK©ÖL,#$Æ…9w¡s£ ©%ŽÆ…£ ©&Æ…£99¯9É7P>è†]Êfè†Wæ#X,#º^Y,#?xZX#.;[,# ¾\Ñ#$Ë…Ê@¡sfl r%WË…l r&Ë…lÊÊxÊÔµdˆìÔµb¿c,#$’ˆÆ¡sìò ø%Ý’ò ø&’òˆˆþˆŒ†h,Äa? nnšoÑ#Iˆp,#ÓqX# lÔrX#âœsX#,Ât,#ˆ½u,#œ¡så!ÄÊ Ð ´a?Ê Ð a?ÊÖb?vy:~ñcy:{ |,#‡},#$ñ…ñ=¡sci o%Tñ…i o&ñ…iññuñc*,¹‹•# ¹†·‡Ñ#o/ˆ,#¡3‰,# ¨ûŠX#$ö…•ý¡s# )  / % ö…)  / &ö…) ••5 •FãE © F㎇,#$û…E ƒ ¡s© ¯  µ %š û…¯  µ &û…¯ E E » E ¶––W!4R„Ç…2 #> † #‡‡,#ìLjW!# /!¡sF¹]!W! c! G!4RW! c! 4RW!Ë Ë i!Ë Œ¬½¢½É=ú7Î2“IÔtî:Û†vKàiéëì;òvóFöÀ(´‡Ä)ñ¡*Ê4$s 8+¦_;Bi4$+Zª<4„4$+û¬=²€4$+ >æ“4$+»}?,“4$+ü\@‘¡4$ +†°AºP4$@+v›B:k4$€,6Cж4$,âDEö4$,ÉEi;4$,MFàË4$,0<G,4$,PÈHS4$ ,rXIÒT4$@+ ´JkÌ4$°+cKÉ 4$J,â³Ll64$+ëMO 4$+ÇPØÓ4$+}½Q4$+Tp4$+øžUß²4$+(‹VJ²4$+Û’Wæ-4$+X­ 4$+òxY?Ø4$ Ôü9Å $¡sï9$?$ E$ $$s ?$ E$ s ?$Åç!ç!K$ç!¹_Yµ&ôv$/F[$¿Zw:Öüx,Jy‘$Å›xµ&föz§$*Ò{P$Ý$¡s®(´( º( õ$/F´( º( %/F´(-$%x Å( Ë(.C%eqƒÒxÑ( Ë( Ë(.b%lt‡ Ñ( Ë( Ë(/‡%Þ$‹Bj, / / >/¢%\âóP3 //Ç%±3“ú²/ / > Ë(/ì%—Wk5 5 / >/&œÝ›±5 5 / >/6&xŸ¾5 5 > :/Q&¼Z£ì: Ø(/l&S©X, Ë(/Œ&ŠD­·JÑ( Ø( Ø(0eof°•Q,1…K´&, Ø(®( Ù 92[?§$#2´(@P$#$¬Nµ&Ò/*\âÕ*­3 /?*±3Ùþ¨  > J+/d*ݨ½‡ ‡  >/‰*œÝáVe‡ ‡  >/®*x埅‡ ‡ > /É*¼Zè½! P+/ä*SëªöB J+/+ŠDï¥ÝÑ( P+ P+0eofòi¼B1…Kö RB P+Þ(Þ(?+Þ(V+B·,ëB²ÂC, î+E5®^G>#5ž¾H>#5 I>#È+¡s·,½, Ã,%ß+(Ž½, Ã,&(Ž½,9àRr+ d,T5@‹V>#5,dW>#>,¡sÎ,Ô, Ú,%U,-ŽÔ, Ú,&-ŽÔ,ã_ù+,¡s’,å,ë, ñ, §,ëë, ñ, ëë,r+r+É,r+ù+ù+à,ù+[+[+÷,[+Šc-y-Š`{^a,#6remb,#$2Ž-S-¡sy-- …-%j-2Ž- …-&2Ž---‹--‰k›- .‰h{^i#6remj#$7Ž›-ç-¡s .. .%þ-7Ž. .&7Ž.›-›-.›-ˆw/.¡.ˆt{^uø#6remvø#$<Ž/.{.¡s¡.§. ­.%’.<Ž§. ­.&<Ž§././.³./.Ò#c9×$uï%€ðZ&‹çZ' ¦(Ê)§dÞ.ÓY2Hvù9S >'ŒñH^ÕøMièiSo÷tu*·Û{•Pnt¸v—–Sñ˜ šè™>;¿¨jÀÅ/„Á,(xÂøÙÅnôÆ {Ç>…òÈ  yÊ,r0 FþG^#"ÏHt#J0¡s=Èr0x0 ~0 b0 x0 ~0  x000„00¦7ÕNŸ01Õ€D˜~H1#$AŽŸ0Ý0¡s11 1%ô0AŽ1 1&AŽ1 1‰0 ïŸ0Ÿ0%1Ÿ0¨U‰0KÑà¶1çÁÃyë×E ïíʮ̙pâ$øC2H¾–D¿C2#zæÀC2#PÁC2#~Â,# ¨@Ã,#¬ÛÄ,#dÅC2#2¡sçI2O2 U2 32HO2 U2 HO2µ/…1…1[2…13Ñý7__xþ3# ®ÿ3#7__c # x #7__a #Ø2¡sk33 3 ð2Ñ3 3 Ñ3 3  ï`2`2"3`2²Ø3393M3, M3 M3S38ÆÛ'3´3:>Œ3¡sð(´3º3 À3 ¤3:º3 À3 :º3`3`3Æ3`3o5+85Gm85#øT95#½6?5#+E5# ,F5#CmG5#ôTH5#¹6I5#£ðJ5# ;2K5#$ûWL:#(ÿWM:#)t_O:#*±IQ:#+™½S:#,ÙéU:#-°b\:#.|]:#/p_`:#0­Ib:#1•½d:#2Õéf:#3¬bm:#4xn:#5G5¡s5^o5u5 {5 _5+u5 {5 +u5Ë3Ë35Ë3y”Xÿû" µ%%,ç… 6½ZÞ5¡sš¸6 6 6 ö5½ 6 6 ½ 6²5²56²5q6!v[I6¡s“gq6w6 }6 a6!vw6 }6 !vw666ƒ667ÍV{$.ˆ6Ì|²5‘5}²5Z(~²5_Ʋ5¦€²5ô6¡sÀ‡7"7 (7 7."7 (7 ."7ˆ6ˆ6.7ˆ6Ç7ʃ$.37Ì„²5‘5…²5Z(†²5_Ƈ²5¦ˆ²5Ÿ7¡srMÇ7Í7 Ó7 ·7.Í7 Ó7 .Í73737Ù737r8er‹$.Þ7ÌŒ²5‘5²5Z(Ž²5_Ʋ5¦²5J8¡s"r8x8 ~8 b8.x8 ~8 .x8Þ7Þ7„8Þ79±2“$.‰8Ì”²5‘5•²5Z(–²5_Æ—²5¦˜²5õ8¡s q9#9 )9 9.#9 )9 .#9‰8‰8/9‰8È9Xõ›$.49Ìœ²5‘5²5Z(ž²5_ÆŸ²5¦ ²5 9¡søäÈ9Î9 Ô9 ¸9.Î9 Ô9 .Î94949Ú949s:ÿ£$.ß9̤²5‘5¥²5Z(¦²5_Ƨ²5¦¨²5K:¡ses:y: : c:.y: : .y:ß9ß9…:ß9;H$«$.Š:̬²5‘5­²5Z(®²5_Ư²5¦°²5ö:¡s+;$; *; ;.$; *; .$;Š:Š:0;Š:É;2³$.5;Ì´²5‘5µ²5Z(¶²5_Æ·²5¦¸²5¡;¡sú¦É;Ï; Õ; ¹;.Ï; Õ; .Ï;5;5;Û;5;t<ð»$.à;̼²5‘5½²5Z(¾²5_Æ¿²5¦À²5L<¡s‘t<z< €< d<.z< €< .z<à;à;†<à;=aUÃ$.‹<ÌIJ5‘5Ų5Z(Ʋ5_ÆDz5¦Ȳ5÷<¡sðý=%= += =.%= += .%=‹<‹<1=‹<Ê=ùJË$.6=Ì̲5‘5Ͳ5Z(β5_Æϲ5¦в5¢=¡spÊ=Ð= Ö= º=.Ð= Ö= .Ð=6=6=Ü=6=u>;Ó$.á=ÌÔ²5‘5Õ²5Z(Ö²5_Æײ5¦ز5M>¡sÃXu>{> > e>.{> > .{>á=á=‡>á= ?8’Û$.Œ>Ìܲ5‘5ݲ5Z(Þ²5_Æß²5¦à²5ø>¡sYì ?&? ,? ?.&? ,? .&?Œ>Œ>2?Œ>Ë?cCã$.7?Ìä²5‘5å²5Z(æ²5_Æç²5¦è²5£?¡sÕPË?Ñ? ×? »?.Ñ? ×? .Ñ?7?7?Ý?7?v@°‹ë$.â?Ìì²5‘5í²5Z(î²5_Æï²5¦ð²5N@¡skv@|@ ‚@ f@.|@ ‚@ .|@â?â?ˆ@â?!AC ó$.@Ìô²5‘5õ²5Z(ö²5_Æ÷²5¦ø²5ù@¡s©Z!A'A -A A.'A -A .'A@@3A@¢A-Ø $]8AQ› ²5zA¡s)¢A¨A ®A ’A]¨A ®A ]¨A8A8A´A8A#BLR$]¹AQ›²5ûA¡sÏ—#B)B /B B])B /B ])B¹A¹A5B¹A¤BŠð$]:BQ›²5|B¡s'³¤BªB °B ”B]ªB °B ]ªB:B:B¶B:B%Cj$]»BQ›²5ýB¡sÑ%C+C 1C C]+C 1C ]+C»B»B7C»B¦Cöš$]DQ›%²5€D¡sÓå¨D®D ´D ˜D]®D ´D ]®D>D>DºD>D)E»W($]¿DQ›)²5E¡sI•)E/E 5E E]/E 5E ]/E¿D¿D;E¿DªE‹,$]@EQ›-²5‚E¡s¸ªE°E ¶E šE]°E ¶E ]°E@E@E¼E@E+FÕÒ0$]ÁEQ›1²5F¡s­+F1F 7F F]1F 7F ]1FÁEÁE=FÁE¬F|4$]BFQ›5²5„F¡s>¬F²F ¸F œF]²F ¸F ]²FBFBF¾FBF-GÞ™8$]ÃFQ›9²5G¡sB-G3G 9G G]3G 9G ]3GÃFÃF?GÃF®GÕ<$]DGQ›=²5†G¡sŸg®G´G ºG žG]´G ºG ]´GDGDGÀGDGHÝ( PñG¡s¿–HH %H HÝ(H %H Ý(HÅGÅG+HÅG„H´ R\H¡sî´„HŠH H tH´ŠH H ´ŠH0H0H–H0HøH³_ T9ÅG#ÐH¡so“øHþH I èH³_þH I ³_þH›H›H I›HlI]Š V9›H#DI¡s¤VlIrI xI \I]ŠrI xI ]ŠrIII~IIàIÎí X9I#¸I¡sËàIæI ìI ÐIÎíæI ìI ÎíæIƒIƒIòIƒI{J‡ê i$u÷I¶È k0H! m!Í€ o!Ø q!•: sSJ¡s‚{JJ ‡J kJuJ ‡J uJ÷I÷IJ÷IGKDü!=9ž!BGK#n!EÜ!#øH!?3åJ¡s¶{LKRK XK ýJDüRK XK3KDü!GRK >-.K#!UL,RK1G!]£ß3RK*3’J’J^K’JÑKô!o:í¦!svVÜ!$ã°cK©K¡s¿ÑK×K ÝK ÁKã°×K ÝK ã°×KcKcKãKcK’L—!žJ—!¤Ü!#"L¡s—ò’L˜L žL :L—˜L žL ML—˜L-eLPî!¨ƒ˜L-}L3z!Ä*˜L4£!Í ˜LèKèK¤LèK+Mò!åJ—!æ+M#3ÜLò!è0M ’L3öLñ!ë0M,;M¡s!îjÁ0M 6M<ò!ï0M 6M’L©L4‹p#pz >LMLMéMLM¢O×7#N=Ì>ß#g¸¸O>5Á#]̓5>Yr#`cA5>,ß#cO3>˜#Z±kèK>¯#Ä—AM$5ZîMÌ¢N¡säá½OÃO ÉO ºN5ZÃO ÉO ÍN5ZÃO?êN~¬#e"53 >?OÛ#i}„3 >?$O³t#$X  >?FO÷#Úüv5 > ÔO@bO"¨#„À¡  >AO‹p#­J >B\Ð#HÉ<  > > ²O²O ïûM*¢OîMîMÏOîM,pP3m#¶$OöÚO/#¸3Í€#¹!Ø#º ú×#»M3C#¼HP¡sÕEpPvP |P `POövP |P OövPÚOÚO‚PÚOOR à$1$Oö‡P´o#~îM/#€3Í€#!Ø#‚5ú×#ƒ/•:#„OR+Î#…TR#†:Q¡s]´YR_R eRD1QOö#Œ_RDKQOö#_R eRDfQˆ#_R,@ˆQ½#“xš5pR Å(@ªQ½#– </pR Ë(@ÑQ"¨#œ7'5_R > M3AôQ‹p#«¨×_R 5 >@Rê#® >3pRA4R2#°Äý_R 5 Ë(E{¤#±^Ã_R 5Å(Ë(‡P‡PkR‡PkR>TÌõ$1$OövR´o#~îM/#€3Í€#!Ø#‚‡ú×#ƒ•:#„>T+Î#…CT#† S¡s-9HTNT TTD SOö#ŒNTD:SOö#NT TTDUSˆ#NT,@wS½#“<Ň_T D+@™S½#–H_T J+@ÀS"¨#œ_‡NT > M3AãS‹p#«ŠNT ‡ >@Tê#®43_TA#T2#°ËNT ‡ J+E{¤#±âÞNT ‡D+J+vRvRZTvRZTF×T|N#x’T¡së¼×TÝT ãT ªTÌÝT ãTD¿TÌ#yÝTGË#zÝT,eTeTéTeTH[UûM#UI #V²OIyô#WY3U¡sgá[U²O aU KU̲O aU ̲OîTgUîTtj[$8Vÿp%â9‡P#WŽ%æ5#»U¡s¥¦tjzj €j ÓUÿpzj €j ìUþpzj,Jÿp%äzj 5 eRXX %: ê&3ªA k:êÿ&8|£5Yâ%¤3#Ûë%¥3#¢;%¦AM#P3%’‡PŠV¡s?›kk k ¢VXk k µVXk/ÑVB2%ª Ñ((k/íV¦µ%®æXÑ((k-W9Š%² žk-WÇ”%¶ >k/9W¦w%ºhØ5k/ZW½®%¾ÑöÅ(k >/€WÙ%ÂÂ5k eR eR@¡WÒÆ&ï°Ôk > eR-¾WC%ͤÊk eRAÜWx¤&uC›k eR/øW±N%×Oó5kBŽd&6þ5k eR >K1%íï‡ kÿÿÿÿ2Ó=%ñxU#Lô&C^+.k$€lUõM%q[$%r:[%s‡P/%t3Í€%u!•:%v>k+Î%wCkØ%x5ú×%y/u%zHkÈ®%|Nk­0%}Tk³0%~ZkM Yº%ù‚}5`kM.Yº%ýÖÑ5kk 5?LYùÅ%uwk`k?jYS‘%N Hk`k?ˆYʪ% H÷Hk`kN¢Yu„% Š…kk?ÅY/‹%çHk`k >?íYÑ%ûñHk`k > >NZFž%/~F 5 Hk HkN3ZFž%3¸7 5 Nk NkNVZFž%7š 5 5 5NyZFž%;À" 5 / /N¢ZR—&#kk > > >N¼Z$ë&}5kkOÒi%E0kDäZ€%^kk3ýZ€&Çkk eR3[€&Àkk qk39[€&Íkk qk > >3a[€&Õkk qk > > eR3„[€&Ükk / > eR3¢[€&âkk / eR3Å[€&ékk > : eRDà[€%ckk,@\¡s%f„swkkk qk@$\¡s%itwkkk /@F\¡s%lÐwkkk :@c\W‘%qhœHkkk@€\W‘%xçNk`kP\end%|yÀHkkkPº\end%ƒ9¹Nk`k@×\„%‡rZkkk@ô\„%‹NÃTk`k@]­9%çZkkk@.]­9%“Tk`k@K]šŽ%˜I3`k@h]\â%›mª3`k@…]ê%žöŠ3`kA¨]Ë"&Z)žkk > :AÆ]Ë"%¤1kk >@ã]Þë%§íe3`kA^FÇ&Ä6škk >A^©R%­|škk@7^£Æ%°³Ñ(`k@Y^½®%µ’þË(`k >@{^½®%¹FÅ(kk >Pœ^at%ÀX˜Ë(`k >P½^at%ÈfJÅ(kk >@ß^ã%Ñûwkkk qk@_ã%ÔÂOwkkk /@#_ã%×DÆwkkk :@E_4{&¡B7wkkk qk@q_4{&±`¾wkkk qk > >@˜_4{&Á½Ûwkkk / >@º_4{%ä‚8wkkk /@á_4{&Ì~žwkkk > :Aÿ_Àž%ðmkk :/ `x&öWzwkkk qk@L`x&Ibwkkk qk > >@s`x&wkkk / >@•`x%ýÃ.wkkk /@¼`x%Z2wkkk > :Aä`¤·% LVkk Hk > :@ a¤·% Žwkkk > qk@ qk > >@ha¤·&9#ówkkk > / >@a¤·%²ýwkkk > /@»a¤·%!I2wkkk > > :@âa¤·%(g"Hkkk Hk :@ bf %1ýÐwkkk > >@+bf %8Z†Hkkk Hk@Rbf %A”åHkkk Hk Hk@~b™·%J¶wkkk > > qk@´b™·&“'¿wkkk > > qk > >@åb™·&^æŒwkkk > > / >@c™·%Vןwkkk > > /@Bc™·%ZfŒwkkk > > > :@nc™·%^çÎwkkk Hk Hk qk@Ÿc™·%c7Xwkkk Hk Hk / >@Ëc™·%g½Ôwkkk Hk Hk /@üc™·&ôkÓwkkk Hk Hk > :@-d™·%w¯wkkk Hk Hk 5 5@^d™·%|Ÿwkkk Hk Hk / /@d™·%Ćwkkk Hk Hk Hk Hk@Àd™·%‡y’wkkk Hk Hk Nk NkMæd/&¨LÖ5 > : eR@eœÝ&j23`k 5 > >A0e 3&Õ0okk wk@Me¦%ͱ"/`k@je•Ñ%Õ<%/`k@‡eKö%اÿ‡P`k@³e±3& ÷3`k / > >@Úe±3%ß,ý3`k qk >@f±3%ã„3`k / >@(f±3&"¥d3`k : >@Of°3%ê&ì3`k qk >@{f°3&5må3`k / > >@¢f°3%ñ$|3`k / >@Éf°3&I׊3`k : >@ðf,k%øä3`k qk >@g,k&\^æ3`k / > >@Cg,k%ÿô3`k / >@jg,k%M13`k : >@‘g­Ã%ðY3`k qk >@½g­Ã&j±Q3`k / > >@äg­Ã%Ú3`k / >@ h­Ã%‹ß3`k : >@2h0“%Â3`k qk >@^h0“&~$º3`k / > >@…h0“%‹3`k / >@¬h0“&ŠŒþ3`k : >@Óh*›%%oõ3`k qk >@ÿh*›&–Mï3`k / > >@&i*›%,«3`k / >@Mi*›&ª°É3`k : >@ti­o%3JlU`k > >@–iÞ$%;c,`k qk@ÂiÞ$&¾ú9,`k > > qk@øiÞ$&ÑѲ,`k > > qk > >@jÞ$&æl,,`k /@FjÞ$&õîn,`k > > /BÞ$&¦,`k > > / >xUxU†jxUõjÖ#Š$RÊ‹jëÒ#Š‡PÍj¡ss@õjûj k åjRÊûj k RÊûj‹j‹jk‹j3VV#kV#k >k3 ïÅ(Ë(n‹{0‡oø~fklUlUfklU…€+t$8lÿp%â9vR#WŽ%æ‡#Ìk¡sTq…€‹€ ‘€ äkÿp‹€ ‘€ ýkþp‹€,Jÿp%ä‹€ ‡ TT-nX %: ê&3‡ k:êÿ&81aYâ%¤3#Ûë%¥3#¢;%¦AM#P3%’‡P›l¡s¼# ) ³lX# ) ÆlX#/âlB2%ª¾FÑ(4/þl¦µ%®ßüÑ(4-m9Š%²Á¹#-.mÇ”%¶Ñ#/Jm¦w%º;š‡#/km½®%¾ÿ£D+# >/‘mÙ%Â)‰‡# TT TT@²mÒÆ&ï-ç# > TT-ÏmC%Í”]# TTAímx¤&u # TT/ n±N%×ã@‡#BŽd&6܇# TT >K1%íù› kÿÿÿÿ2Ó=%ñ‰k#Lô&CyÉ.k$€}kõM%qÞ(%r[%svR/%t3Í€%u!•:%v:+Î%w?Ø%x‡ú×%yu%zDÈ®%|J­0%}P³0%~VMoº%ùšh‡\M?oº%ý-‡g ‡?]oùÅ%!#\?{oS‘%!€D\?™oʪ% IäD\N³ou„% =g?Öo/‹%ýˆD\ >?þoÑ%2•D\ > >N!pFž%/è ‡ D DNDpFž%3€q ‡ J JNgpFž%7õ ‡ ‡ ‡NŠpFž%;cO ‡  N³pR—&mg > > >NÍp$ë&}(…gOÒi%EËÜDõp€%^g3q€&Çg TT3'q€&Àg m3Jq€&Íg m > >3rq€&Õg m > > TT3•q€&Üg  > TT3³q€&âg  TT3Öq€&ég >  TTDñq€%cg,@r¡s%f&)sg m@5r¡s%iïåsg @Wr¡s%lÀsg @trW‘%q“}Dg@‘rW‘%x+¢J\P®rend%|ØQDgPËrend%ƒ".J\@èr„%‡&¶Vg@s„%‹/nP\@"s­9%DÌVg@?s­9%“i¡P\@\sšŽ%˜_3\@ys\â%›ÊO3\@–sê%žàŽ3\A¹sË"&Z7Ug > A×sË"%¤ÜÖg >@ôsÞë%§‡3\AtFÇ&Ä"Mg >A+t©R%­«øg@Ht£Æ%°'éÑ(\@jt½®%µÊJ+\ >@Œt½®%¹MºD+g >P­tat%À 0J+\ >PÎtat%ÈÿòD+g >@ðtã%ÑZ{sg m@uã%ÔaÄsg @4uã%×Xsg @Vu4{&¡)qsg m@‚u4{&±¬Csg m > >@©u4{&ÁØïsg  >@Ëu4{%ä\ysg @òu4{&ÌÇUsg > AvÀž%ð=g /1vx&öZsg m@]vx&oÁsg m > >@„vx&áqsg  >@¦vx%ýhsg @Ívx%“äsg > Aõv¤·% C³g D > @w¤·%Яsg > m@Mw¤·&,.sg > m > >@yw¤·&9­Hsg >  >@ w¤·%Øþsg > @Ìw¤·%!¡¿sg > > @ów¤·%(…µDg D @xf %1ù}sg > >@ > m@Åx™·&“.vsg > > m > >@öx™·&^ usg > >  >@"y™·%VGŠsg > > @Sy™·%ZxŠsg > > > @y™·%^åÃsg D D m@°y™·%cd±sg D D  >@Üy™·%gûásg D D @ z™·&ôÐñsg D D > @>z™·%wˆîsg D D ‡ ‡@oz™·%|kØsg D D  @ z™·%P×sg D D D D@Ñz™·%‡€¬sg D D J JM÷z/&¨îê‡ >  TT@#{œÝ&ø3\ ‡ > >AA{ 3&Õj|g s@^{¦%Í?\@{{•Ñ%ÕC\@˜{Kö%ØK½vR\@Ä{±3&>ë3\  > >@ë{±3%ßEB3\ m >@|±3%ã ä3\  >@9|±3&"?œ3\  >@`|°3%êŠv3\ m >@Œ|°3&5k>3\  > >@³|°3%ñYn3\  >@Ú|°3&I$ˆ3\  >@},k%ø¬3\ m >@-},k&\Õ3\  > >@T},k%ÿ{23\  >@{},k%W)3\  >@¢}­Ã%Ó3\ m >@Î}­Ã&jÜ3\  > >@õ}­Ã%ˆ3\  >@~­Ã%Íï3\  >@C~0“%›©3\ m >@o~0“&~e²3\  > >@–~0“%*Ï3\  >@½~0“&Š‚„3\  >@ä~*›%%¼Õ3\ m >@*›&–O«3\  > >@7*›%, 3\  >@^*›&ª¯83\  >@…­o%3k}k\ > >@§Þ$%;CM,\ m@ÓÞ$&¾èÛ,\ > > m@ €Þ$&Ññ,\ > > m > >@+€Þ$&朠,\ @W€Þ$&õƽ,\ > > BÞ$&ÉB,\ > >  >‰k‰k—€‰kÖ#Š$RÊœ€ëÒ#Š‡PÞ€¡s£   ö€RÊ   RÊ œ€œ€œ€ll/l/D+J+ãvÉʧb}k}kb}k«‚+i'E‚Ñ'B–WŽ'G«‚#Â×'H…# Ä+i±‚ ·‚3â+i'J±‚ «‚ –3ö+i'M±‚/‚±¢'N@\Ñ(‚/3‚¡s'PÞÈ‚±‚ Ñ(/T‚¡s'V2LÈ‚±‚ ·‚/u‚3'X°Ñ(‚ ·‚/–‚—s'Z÷÷Ñ(‚ ·‚4_±'[d˜±‚…y½‚y½‚ybƒáJ i$u΂¶È kƒI mÑ(Í€ o!Ø qbƒ•: shƒ:ƒ¡sÌQsƒyƒ ƒ Rƒuyƒ ƒ uyƒÑ(mƒÑ(΂΂…ƒ΂!…€'_9΂#WŽ'`«‚#­8'a>#Ûƒ¡s´Ò!…'… -… óƒ€'… -…3„€'d'… «‚ >-)„m8'f#u'…-A„k'lèµ'…-^„#'s%Ñ'… ,/„3'~ç/Ñ(8… -…/ „—s' Ñ(8… -…/Á„íº'„A%Ñ(8… -…/â„«s'‡<Ñ(8… -…/…·Î'Š[ Ñ(8… -…1.6' rÑ(8… -…ŠƒŠƒ3…Šƒ3…‡s'™9Šƒ#•:'šyØ'›±‚u'œ>…”…¡svœ‡‡ "‡ ¬…s‡ "‡3À…s'ž‡3Þ…s' ‡ «‚ >/ú…s'¢}Ìy-‡/†^á'£ˆ‡‡/7†^á'§g=>…‡ ,/S†ýê'¬6ó‡‡/t†ýê'°lò>…‡ ,/•†ã'µ!‡‡ ,/¶†d'¹ã‡‡ ,/׆s'½È³>…-‡ ,/ø†.s'Á™>…-‡ ,1½®'ÆßHy‡ ,>…>…(‡>…(‡/‰Ã®'Î9Šƒ#•:'ÏÑ(+Î'ÐÑ(Ø'Ñ/‰È®'Ò3‡”‡¡s8Ê:‰@‰ F‰ ¬‡î@‰ F‰3À‡î'Ô@‰3Þ‡î'Ö@‰ «‚ >3÷‡î'Ø@‰ "‡/ˆs'ÚËÑ(Q‰//ˆ^á'ÝT­:‰@‰/Pˆ^á'áM¬3‡@‰ ,/lˆýê'æ©:‰@‰/ˆýê'ê3‡@‰ ,/®ˆã'ï@5:‰@‰ ,/ψd'ó e:‰@‰ ,/ðˆs'÷«ë3‡Q‰ ,/‰.s'ûX3‡Q‰ ,1½®'ÿÂqÑ(@‰ ,5‰Ñ(3‡3‡L‰3‡L‰"p‰7(]#˜Ä#Ȳ=Š¸•(`ri(cW‰#Ó°(d=Š#;›(e=Š#ñ×(f=Š# þ(a=Š߉¡sßlCŠ=Š IŠ ÷‰¸•=Š IŠ Š¸•=Š/%Šð(j…=Š =Š14(qq¯=Š =Šp‰p‰OŠp‰‹òt(Nb(„=Š#þ(€=Š¶È(IÍ€(‚!¯Š¡sŠ+‹ ‹ ‹ ÇŠòt ‹ ‹ ÚŠòt ‹-òŠo¿(ˆ€^ ‹4r(žFí ‹TŠTŠ‹TŠŽ)9+Þ})TÈŽ+gª)UjÖŽ+g)Vß°Ž+~-)WÏZŽ+œÛ)XÍ\Ž+bØ)YN€Ž+‰)Z+2Ž Qall)\õ>Ž?ÎÈ2i)#Ž#L”)’ï~#ŽLR))•‚a#ŽRø)œF kR¼E)£¾‰ kL™<)ª‹w)Ž )<>STŒÚ>×$)ZK6&ÁTid3mŒ)_9Ž3†Œ)a9Ž ?Ž3ŸŒ)d9Ž /3ÂŒ)f9Ž ?Ž / >3åŒ)h9Ž ?Ž ?Ž >3ÿŒ7„)m9Ž,/ ¡s)pÚ ?Ž9Ž ?Ž!€$ >X†')º„9Ž ?Ž ?Ž >>º‹ 9Ž/ ï ‹EŽ‹EŽY<)À2¢;)ÔAM#2¤Ó)Õî#2þã)Ö3#2")Ùú# Laª)Ú}’ ‘L{g)ÛF¡0‘Lx-)ÜÙG@‘L–Û)ÝÍÌP‘L\Ø)Þ>X`‘Lƒ)ßKp‘L"†)àRg‹‘;/Ž:)äsÔ#Ž;H&I)èZ#ŽVgÎÈ)ò#Ž ‘ >V†ÎÈ)ó#Ž / >VªÎÈ)ô#Ž î > Ñ(VÅÍÈ)ö#Ž,VßÎÈ)ø#Ž ‘;ý¡s)û‘#Ž ‘MÖ©)ÿîWÑ(#ŽN>çª) \(#Ž ›‘ >Nb ) çÑ#Ž ›‘ €‘N†Ï)b:#Ž ›‘ ‘Nª6Â)MŸ#Ž ‘ ô?ÍÄ9)Á—§‘#Ž >Z@0)&å{#Ž §‘ ,ô6Œ ‘5 ï ‘‘[‘TŒ ‘ 0‘‘[%‘ @‘‘[5‘ P‘‘[E‘ `‘‘[U‘ p‘‘[e‘ €‘€‘[†‘‘u‘–‘PŽ–‘¯¡‘FD’TŒ)\)3#>v”) AMNü‘¡s)“ŒÊD’ J’]’id)•D’ J’^*’id)šD’BÄ)ž‘û3‘­‘‘"e’*7#¹ì€€"z’©+*V#€€"’K˜*u#1`€€"¤’ýª*“#]€€›)xl*Ÿ_Ð’¾*Z#þ½#L‹#ZT¨“é©*|á@*~›#fò*4›#*€,#¤­*AM# 9“¡s¶(:›› @› Q“é©› @›Du“é©*…› 4› , ›AŽ“Ž:*ˆB²›B&I*Œ,›”®*™ó]*š #ßi*›#ó“¡s ÎK›Q› W› ”®Q› W›G®*œQ›ñ”ŧ*»>é˜*ÎÂ4,>þ¯*ÏWÑ(p”¡s<b›h› n› ˆ”ŧh› n›D”ŧ*¾h›D¸”ħ*¿h›,AД *Â-* Ñ(`ôO*ÅÇaMa*Ë…nÑ(:©_*Ö—y›bdec*Øyky›:þ¬*ÚªTy›bhex*ÜCzy›:¾}*àJAy›:>›*ãÔty›boct*å%5y›:ô×*è«Öy›:9*êê,y›:å*ílKy›:Ì*ðf´y›:M*òE—y›:3<*ô&Yy›:SÈ*ö:Êy›:uX*ùÇ‚y›:´*ûÓŽy›:c*ý^Ìy›:å³*ÿC±y›cîM*ËJ~›cÇ*1~›c€½* º~›c*^^~›dapp**¼fƒ›date*,嚃›c(¿*1ýƒ›din*3Dƒ›dout*5­yƒ›cõx*7Üqƒ›dbeg*ET¡ˆ›dcur*GLj›dend*I²¸ˆ›¢Î+!\D*r —#\þH*s —#\ *tP’#\ø©*uz’# \¨›*vz’#\¶X*›#\.* ¨“#eZ÷*¤D \UO*¥›# \’Ž*¨,#`\žw*©Q›#d\Lª*¯‹#hmHrÃ*ÔP’Â* z’(¡*(e’ ×*C’ÿŠ*c4›A?˜†5*iã)› 4› ,N^˜Û*’N› °’Nx˜!š*•sЛ?›˜Œ”*¬!íK›› ,Nµ˜:<*²ý½›@Ò˜ *ØÉèP’£›@ô˜ *ã}/P’› P’@™K.*ó…P’› P’@=™K.*JÉP’› P’ P’A[™I.*@e› P’@x™G*Ù —£›@š™G*'óZ —› ,@·™I*4° —£›@Ù™I*=2& —› ,@õ™Ú,*O,IÑ( Ñ(@š›*[è‹› ?Ž@4šëé*f⬋£›@Qšèé*pà\?Ž£›a-R*wïø,@…šâi*~¬®›› ,@§šö]*‰c´›› ,Dš(x*”›,fØš)x*—›fóš)x*œ› º›g¡s*ŸZ@.›› º›Ð’.› °’ .› ,¤’›Ð’F›Ð’¨“¨“]›¨“””t›”P’z’e’’ ›¨“ 裸©›¤’ ©›µ&µ&Ò›µ&Ò›´!+C–+Éó›ù›×6©!,%,©²,,Î,ƒ“,-0•,­_,.€Ý,:,/›,9,0;t,âé,1ÿõ ,1R,2:ñ@,Ñ,3: €+A,4þ:+q,5,—+RS,6m Ú,'Å×,+ ¡s¤V6< B &©!< B ©!<þ›þ›Hþ›Å#-0"}Sù-3hok#¼9#G¬#×I¡s ÒÅË Ñ µ#Ë Ñ #ËMM×MÉŸ HP./R ê.9äw 2S^.;ÉŸ#2¾g.=ÉŸ# 2•½.@§5#@2 |.B§5#D2ï.E,#H26.H,#L„ï.4§53tž H.LÙŸ3œž H.TÙŸ / / , ,3µž H._ÙŸ ߟ/Öž¡s.jþ‡êŸÙŸ ߟ3ðžH.uÙŸ,-Ÿ:<.÷ÙÙŸ/$Ÿw.‘ZÏÑ(ÙŸ/@Ÿé.šxCðŸÙŸ/\ŸG´.ž^‡ðŸÙŸ/xŸ\_.¢û(,ÙŸ/”ŸÇë.¦~Ö,ÙŸ/°Ÿ4÷.ªà–/ÙŸ1¿¢.®Wå/ÙŸ ÙŸ: ïÜåŸÜÜöŸ§5Å î;/c‡f/,0@/>/1ùò/M ¡s;£Å Ë  Ñ  e î;Ë  Ñ  x î;Ë N  Š¸/?Þ" º› 5 : ,ZëŸ/CYÊ º› 5 : :ûŸûŸ× ûŸ]¡~§/@_¡KÑ/B#Œâhdmyhmdyhymdhydm5¡¡s?]¡c¡ i¡ M¡~§c¡ i¡ ~§c¡Ü Ü o¡Ü ‘¢ùe/È_­¡…/Ê#Þ}#âé# +#D2#!³¢ï¸/Ë c/Ë*#é¡¡sm€‘¢—¢ ¢ ¢ï¸—¢ ¢ ︗¢cm´/ÍûÜ£¢C¢¡sZF¨¢®¢ ´¢ [¢ùe®¢ ´¢ n¢ùe®¢Bâ¸/ÒN­¡ : : :­¡­¡£¢­¡t¡t¡º¢t¡ £/Ú'/Û,ø¢¡sO¶ £&£ ,£ £&£ ,£ &£¿¢¿¢2£¿¢"b£ˆ0™#.£#‡#ñ^#›D#Zù"£¶<0¢#Í#Éã#0xR¥›"0¬:Ut0­ê65‰+X0¯„+qº0°‘÷: Ñ0±´¤5‰:\‘0²G5‰:Ù0³EU5‰+4~0´BP+0¶ Š+¼0·¬ñ+1l0¸+0¹iz:0»Œ75‰:5J0¼Šÿ5‰:Ô#0½ ë5‰:+©0¾NÆR¥:o0¿à5‰:s&0Á»ð5‰:Ú0Âùš5‰:=90à¬5‰:-0Å!i5‰:vî0Æ5G5‰:Ž0ÇÎòW¥*¥¡sm‚\¥b¥ h¥ B¥›"b¥ h¥ ›"b¥b£7£££n¥£à§Ú–0Û:Ut0ܬ5‰+X0ã ¢+qº0äi: Ñ0åÂ5‰:\‘0æ8Î5‰:Ù0çÉÇ5‰+4~0è“ò+0îf+¼0ïÉZ+1l0ðÅà+0ñ]:0óA5‰:5J0ô©Æ5‰:Ô#0õŠì5‰:+©0öPR¥:o0÷]b5‰cs&0çp5‰cÚ0]5‰c=90M5‰c-0 «·5‰cvî0 ºÃ5‰cŽ0 ¼ÓW¥$¯us¥+§¡sÚñà§æ§ ì§ C§¯uæ§ ì§ V§¯uæ§0min0ß;{Ñ(0max0᧽Ñ(UÇ—0êŒ,Ñ(UA¬0ì´•Ñ(U¨D0úÎáÑ(U9J0üº±Ñ(UØ#0þŠ¤Ñ(aW0[}Ñ(s¥s¥ò§s¥|ªÓ0cUt0ò5‰iX0Yiqº0$´c Ñ0mÒ5‰c\‘0°5‰cÙ0,5‰i4~09ìi0#Fši¼0$ʽi1l0%„i0&Kc0(NI5‰c5J0)he5‰cÔ#0*UÑ5‰c+©0++R¥co0,3H5‰cs&07*"5‰cÚ085‰c=909&5‰c-0;S 5‰cvî0<r­5‰cŽ0=ïUW¥$¯u÷§À©¡s1g|ª‚ª ˆª Ø©¯u‚ª ˆª 멯u‚ªjmin0RÀ:jmax0TC:aÇ—0 u:aA¬0! Ç:a¨D0/õ°:a9J01™à:aØ#03î:aW05µ:÷§÷§Žª÷§­#›0BcUt0C„'5‰iX0Jô2iqº0KBc Ñ0Lc25‰c\‘0Mìð5‰cÙ0N g5‰i4~0Ow÷i0U†.i¼0Viái1l0W›®i0XVqc0Zez5‰c5J0[(5‰cÔ#0\§5‰c+©0]?oR¥co0^Ix5‰cs&0iû5‰cÚ0jE5‰c=90k¿‚5‰c-0mL5‰cvî0n±Ö5‰cŽ0oTSW¥$¯u“ª\¬¡sú€­­ $­ t¬¯u­ $­ ‡¬¯u­jmin0F4†¨jmax0Hi¼¨aÇ—0Q¡Ý¨aA¬0Sb¨a¨D0af¨a9J0cü¨aØ#0e0¸¨aW0g¬°¨“ª“ª*­“ª´¯È¬0tcUt0u‡¢5‰iX0|fPiqº0} 2c Ñ0~ûÞ5‰c\‘0¥³5‰cÙ0€¤Œ5‰i4~0ÿÏi0‡êi¼0ˆ(\i1l0‰ i0Š!çc0ŒQ5‰c5J0›†5‰cÔ#0Ž à5‰c+©0ŒR¥co07.5‰cs&0› Ì5‰cÚ0œ\a5‰c=90/5‰c-0Ÿé5‰cvî0 ×85‰cŽ0¡×ãW¥$¯u/­ø®¡së ´¯º¯ À¯ ¯¯uº¯ À¯ #¯¯uº¯jmin0x+njmax0zŠžnaÇ—0ƒ7ïnaA¬0…nÍna¨D0“-ùna9J0•—ÕnaØ#0—t¾naW0™s?n/­/­Ư/­P² ’0¦cUt0§U¦5‰iX0®·þiqº0¯kÒ c Ñ0°P5‰c\‘0±®#5‰cÙ0²”ü5‰i4~0³Äwi0¹æ¬i¼0ºŸ:i1l0»¯+i0¼GÂc0¾Ë]5‰c5J0¿©ç5‰cÔ#0Àõ5‰c+©0Á,¦R¥co0ÂyŒ5‰cs&0Í415‰cÚ0·y5‰c=90Ï;O5‰c-0Ñ3‘5‰cvî0Ò|í5‰cŽ0ÓùW¥$¯u˯”±¡sÝ|P²V² \² ¬±¯uV² \² ¿±¯uV²jmin0ªJÄjmax0¬|¥aÇ—0µÄ^aA¬0·(×a¨D0ÅrÛa9J0ǪºaØ#0ÉŽaW0Ë`ê˯˯b²˯ì´“80ØcUt0ÙíÌ5‰iX0à9iqº0áønc Ñ0âvÆ5‰c\‘0ã6©5‰cÙ0ä«™5‰i4~0åßõi0ë²Ùi¼0ì†i1l0í+}i0î÷c0ð•­5‰c5J0ñSh5‰cÔ#0ò¾u5‰c+©0óËR¥co0ô8ä5‰cs&0ÿÓ 5‰cÚ0ù5‰c=90œô5‰c-0\©5‰cvî0 J5‰cŽ01ƒW¥$¯ug²0´¡sèˆì´ò´ ø´ H´¯uò´ ø´ [´¯uò´jmin0ÜÈ Åjmax0Þ^’ÅaÇ—0ça3ÅaA¬0é”fÅa¨D0÷N¢Åa9J0ùTôÅaØ#0û ZÅaW0ý¬ŽÅg²g²þ´g²ˆ·90 cUt0 (·5‰iX0ê©iqº0Dc Ñ0o•5‰c\‘0¨ˆ5‰cÙ0ªï5‰i4~0Nˆi0& i¼0'ci1l04”i0 Ýýc0"±¾5‰c5J0#•5‰cÔ#0$ÖÔ5‰c+©0% R¥co0&ÔÏ5‰cs&01{Þ5‰cÚ02Á×5‰c=903¾Þ5‰c-05B£5‰cvî06­45‰cŽ07ÿW¥$¯uµ̶¡sùˆ·Ž· ”· 䶯uŽ· ”· ÷¶¯uŽ·jmin0’K jmax0ˆÔ aÇ—0| aA¬0K@ a¨D0)Šq a9J0+û" aØ#0-B aW0/çc µµš·µ$º¤ñ0<cUt0=5‰iX0DWÂiqº0Eèy c Ñ0FK®5‰c\‘0Gì5‰cÙ0H@Ö5‰i4~0IÈÈi0O#Ñi¼0PFi1l0QÕKi0R®Óc0TX…5‰c5J0UÒ"5‰cÔ#0V¿ 5‰c+©0W”PR¥co0X#Ã5‰cs&0c…Z5‰cÚ0dä)5‰c=90eÃ5‰c-0g£â5‰cvî0hâÍ5‰cŽ0iáhW¥$¯uŸ·h¹¡s_$º*º 0º €¹¯u*º 0º “¹¯u*ºjmin0@ÇY,jmax0Bcâ,aÇ—0Ki7,aA¬0My,a¨D0[¿Œ,a9J0],aØ#0_º,aW0aªs,Ÿ·Ÿ·6ºŸ·À¼ü0ncUt0oùz5‰iX0v0 iqº0w{à c Ñ0x¾~5‰c\‘0y–Í5‰cÙ0z’'5‰i4~0{/Åi0Èi¼0‚7i1l0ƒXƒi0„ý¾c0†#½5‰c5J0‡Å5‰cÔ#0ˆ$y5‰c+©0‰‘HR¥co0Šƒ®5‰cs&0•¾Ê5‰cÚ0–!5‰c=90—Ë5‰c-0™ Þ5‰cvî0šî 5‰cŽ0›Ì:W¥$¯u;º¼¡sÐ…À¼Ƽ ̼ ¼¯uƼ ̼ /¼¯uƼjmin0r >jmax0t×+>aÇ—0}‘‡>aA¬0T7>a¨D0Y>a9J0×6>aØ#0‘Û >aW0“J>;º;ºÒ¼;º\¿mË0 cUt0¡kQ5‰iX0¨Êiqº0©.] c Ñ0ª­5‰c\‘0«Æ‹5‰cÙ0¬r¹5‰i4~0­¹i0³eoi¼0´ i1l0µKêi0¶Ï›c0¸5‰c5J0¹> 5‰cÔ#0ºÄÝ5‰c+©0»txR¥co0¼ ã5‰cs&0Ç §5‰cÚ0ÈÛÛ5‰c=90ɯ5‰c-0ËÄÐ5‰cvî0Ì°â5‰cŽ0Í? W¥$¯u×¼ ¾¡sQi\¿b¿ h¿ ¸¾¯ub¿ h¿ ˾¯ub¿jmin0¤Ë%jmax0¦ÿFaÇ—0¯aA¬0±åa¨D0¿Ÿöa9J0Á’œaØ#0ÃKàaW0ÅEK×¼×¼n¿×¼øÁÊÇ0ÒcUt0ÓÛC5‰iX0Úì‰ iqº0Û"© c Ñ0Ü3Ž5‰c\‘0ÝÄk5‰cÙ0Þg 5‰i4~0ß»±i0åT£i¼0æ°÷i1l0çX!i0èu‡c0ê R5‰c5J0ëîƒ5‰cÔ#0ì·œ5‰c+©0íhèR¥co0îl5‰cs&0ùó85‰cÚ0úÚ»5‰c=90ûo95‰c-0ýÍ5‰cvî0þÃÊ5‰cŽ0ÿtW¥$¯us¿<Á¡sÚÙøÁþÁ  TÁ¯uþÁ  gÁ¯uþÁjmin0Öm–jmax0Øõ–aÇ—0áÖj–aA¬0ã›Ï–a¨D0ñÄÄ–a9J0óÂΖaØ#0õ»Ë–aW0÷†Ð–s¿s¿ Âs¿”Ävü0cUt0“k5‰iX0 or?iqº0 ëçc Ñ0`c5‰c\‘0š5‰cÙ0CJ5‰i4~04qi0~i¼0 Hi1l0U]i0ß±c0]‘5‰c5J0•‰5‰cÔ#0>Ó5‰c+©0F…R¥co0 öÞ5‰cs&0+5‰cÚ0,Y5‰c=90-Ù¾5‰c-0/Þ‡5‰cvî00ÁÕ5‰cŽ01s¹W¥$¯uÂØás‡Á”ÄšÄ  Ä ðïušÄ  Ä įušÄjmin0Çbøjmax0 AèøaÇ—0ýªøaA¬0h øa¨D0#(­øa9J0%IøaØ#0'|7øaW0)àø¦ÄÂ0Ç·06cUt07wU5‰iX0>“•@iqº0?¦7c Ñ0@)Ÿ5‰c\‘0AGå5‰cÙ0B’“5‰i4~0Cski0I*)i¼0Jci1l0Kg‘i0LTžc0NÜÆ5‰c5J0Oˆ&5‰cÔ#0Pù”5‰c+©0QÇeR¥co0Rÿ_5‰cs&0]sê5‰cÚ0^é45‰c=90_Ùê5‰c-0aÄ…5‰cvî0b×Â5‰cŽ0cŠ”W¥$¯u«ÄtÆ¡sŽ80Ç6Ç <Ç ŒÆ¯u6Ç <Ç ŸÆ¯u6Çjmin0:Á¦ jmax0<¡ aÇ—0E¹õ aA¬0Gã= a¨D0U2| a9J0W9 aØ#0YŸã aW0[, «Ä«ÄBÇ«ÄÒÉ8b0hcUt0i=á5‰iX0p!jiqº0qï–c Ñ0rð;5‰c\‘0sÎO5‰cÙ0tˆô5‰i4~0u„3k0{ 9ƒÿÿÿk¼0|•‚Ûÿÿÿi1l0}·²€i0~Ø &c0cç5‰c5J0ƒ„H5‰cÔ#0„(³5‰c+©0†¼ÍR¥co0‡F5‰cs&0“ÌÉ5‰cÚ0”h 5‰c=90•°5‰c-0—5‰cvî0˜œi5‰cŽ0™#W¥$¯uGÇÉ¡s,ºÒÉØÉ ÞÉ .ɯuØÉ ÞÉ AɯuØÉjmin0lÇŒéÉjmax0n@éÉaÇ—0wVéÉaA¬0yfdéÉa¨D0ŠŸ éÉa9J0ŒPwéÉaØ#0ŽáVéÉaW0º@éÉGÇGÇäÉGÇ”¸}ÌŸ0¢cUt0£Zï5‰iX0ªø†5iqº0«öÿc Ñ0¬£5‰c\‘0­¯5‰cÙ0®`5‰i4~0¯æk0µ*Ïüÿÿk¼0¶q©Íþÿÿl1l0·ëLl0¸‡24c0»šO5‰c5J0½ 5‰cÔ#0¾ßã5‰c+©0À‡R¥co0Ás15‰cs&0Íéí5‰cÚ0Îá5‰c=90ÏB“5‰c-0Ñé5‰cvî0ÒË•5‰cŽ0ÓÊ×W¥$¯uðÉÁË¡sƒÕ}ÌƒÌ ‰Ì Ù˯uƒÌ ‰Ì ì˯uƒÌjmin0¦J”Ìjmax0¨õŒ”ÌaÇ—0±…¾”ÌaA¬0³2ý”Ìa¨D0Ä(€”Ìa9J0Æ'”ÌaØ#0È>~”ÌaW0Ê_5”ÌðÉðÉÌðÉk#(Ï€=0ÜcUt0Ý›Ú5‰iX0ä¸÷@iqº0å Mc Ñ0æÖr5‰c\‘0ç‘Œ5‰cÙ0襪5‰i4~0é®ák0ïõÀÿÿk¼0ð•½ìÿÿl1l0ñ”Ó@l0òI&Dc0õµ5‰c5J0÷|¦5‰cÔ#0øK¤5‰c+©0úoR¥co0ü×5‰cs&0ξ5‰cÚ0 «Á5‰c=90 ¿5‰c-0 Fû5‰cvî0 DÁ5‰cŽ0v^W¥$¯u›ÌlΡsÜõ(Ï.Ï 4Ï „ίu.Ï 4Ï —ίu.Ïjmin0àqJ?Ïjmax0âgÐ?ÏaÇ—0ë(¤?ÏaA¬0í-?Ïa¨D0ÿ±K?Ïa9J0ÌF?ÏaØ#0ri?ÏaW0B¼?ϛ̛Ì:Ï›Ìf# ª™1E,¤C2?Ïýõ2?ÏÝø3sÏ_ŸÏÝø3#Aó#­#]#Ð#ãà?ÐŽè 3†¦3,#ä©35#V}3”Ì#õ3 ”Ì#½k3!”Ì#Сs“1?ÐEÐ KÐ /ÐŽèEÐ KÐ ŽèEПϟÏQПÏS/ÑŠXÑ•Ì4k4mÑ(#s’4n/Ñ#«Ð¡s÷Ô:Ñ@Ñ FÑ ÃЕÌ@Ñ FÑ3ÜЕÌ5,@Ñ 4ÑD÷ДÌ4‡@Ñ,B±¢4™|©Ñ(@Ñ1Ô.4Áù4Ñö“ ,4ÑVÐ`Ð`ÐLÑ`ÐS ÒAm•Ì4k4mÑ(#s’4n Ò#¢Ñ¡søºÒÒ Ò ºÑ•ÌÒ Ò3ÓÑ•Ì5,Ò ÒDîÑ”Ì4‡Ò,B±¢4™æÑ(ÒÒQÑ[Ñ[Ñ&Ò[ÑSûÒE©m•Ì6B\6mÑ(#õM6E[$6h6FûÒÓ 6G+ÒM6HÓÔü6I,ªÒ¡s€›Ó%Ó +Ó ÂÒ•Ì%Ó +Ó3àÒ•Ì7-%Ó 6Ó Ñ(B±¢6jåËÑ(%ÓSÓ ÎR@[õœ k«*5Ò5Ò1Ó5Ò+ÒS ÔÆ*m•Ì6B\6mÑ(#õM6EÞ(6h6F ÔÓ 6G<ÓM6H*ÔÔü6IB»Ó¡s¤|0Ô6Ô <Ô ÓÓ•Ì6Ô <Ô3ñÓ•Ì7-6Ô GÔ Ñ(B±¢6j´6Ñ(6ÔS*Ô™€R@[õh  k‰<FÓFÓBÔFÓ<Ó ×.è88®54Q298: ×#2¤/8<Ñ(#$œMÔ«Ô¡s?æ×× × ÃÔœ× ×3çÔœ8?× (×Q01Ü!-Õ 8CÁ× e’ ÔO ÔO 5/>Õ_8F ‘×× / e’ ,/dÕO8I{+×× × e’/ÕO8Lì„×× , e’ Ñ(/«Õ»›8O1ë,×/ÌÕÐ 8RlŒ,× ,/èÕÎÏ8U;F××/Ö\8X4Ñ(.×.Öfd8[ ,×39Ö›8]×,/_Ö#)8`É: —× / ,/…Ö«Â8cfû —× 5 ,/°Öç×8g0¹§$×  ’ e’/ÖÖ@8kêk§$×  e’/òÖ`˜8n·,×1¦8qîÊ —×YÔMÔMÔ#×MÔÛÔ#פ×j¹99®®9:,#ž-9;,#|סsV|¤×ª× °× ”×j¹ª× °× j¹ª×4×4׶×4ב9>ª×"åׂ÷9\#´#6#HSUØ“ñ9l„ü9n0#¤ 9p0#-Ø¡s\ãUØ[Ø aØ EØ“ñ[Ø aØ “ñ[Øå×å×gØå×ïX9x,Sc)%·*KØ“ØžØ ,¹*‚ØðÀÇ‚ØÙ÷½:"æY:#,æ:$ öØ¡s¡ÛÙ$Ù *Ù Ù÷½$Ù *Ù ÷½$ٴشØ0Ù´Ø$*:%´ØøÜ6Ü€:4„à:5,#@ä:6,#¯²:8,#¢Üt:;¸ñ:<øÜ îÙ:@q-:A‘#µ«:B2#ÈÙ¡sÝÝ Ý%ßÙ·—Ý Ý&·—ÝâÛ:C‰Ù lÚ :Gf“:H,#Œc:I,#ô½:J5Ù#FÚ¡sÝ%Ý +Ý%]Ú¼—%Ý +Ý&¼—%Ýæ$:KùÙ êÚ :Oq-:P‘#µ«:Q2#ô½:R5Ù#ÄÚ¡s6Ý<Ý BÝ%ÛÚ”›<Ý BÝ&”›<Ýn_rt:SwÚ „Û:Wq-:X‘#µ«:Y2#æ:Z,#‰,:[2# šÆ:\2#^Û¡sMÝSÝ YÝ%uÛ™›SÝ YÝ&™›S݈û:]õÚ æÛ:aò:b #ÀÛ¡sdÝjÝ pÝ%×Ûž›jÝ pÝ&ž›jÝ¡:cÛ VÜ:gû:h#%:i,#0Ü¡s{ÝÝ ‡Ý%GÜ£›Ý ‡Ý&£›ÝPâ:jñÛ|Ü¡s’Ý˜Ý žÝ%“ܲ—˜Ý žÝ&²—˜Ý‹:kvÙ# ÐÜ¡sx5©Ý¯Ý µÝ èÜ6Ü¯Ý µÝ 6Ü¯Ý Ý, ï‰Ù‰Ù݉ÙùÙùÙ1ÝùÙwÚwÚHÝwÚõÚõÚ_ÝõÚÛÛvÝÛñÛñÛÝñÛvÙvÙ¤ÝvÙ@Ù@Ù»Ý@Ù‘Í:l@Ù2ßv@:£u:5Ù#ÏÛ:,#°2:,#oÛÞ4:I¸ñ:2ßIh“:‘pŽÞ: Ïg:!Mß#èÄ:" #hÞ¡sSßYß _ß%Þ“žYß _ß&“žYßIî«:#&ÞµÞ¡sjßpß vß%ÌÞŽžpß vß&Žžpßèi:$Þ#  ß¡s ×ß‡ß ß "ßv‡ß ß v‡ß Bß, ï Mß ´ØBß&Þ&Þeß&ÞÞÞ|ßÞËÝËÝ“ßËÝ:%ËÝ‘àqŒ;à;÷?; ‚Øn;"¬àéß¡s²à¸à ¾à%à˜ž¸à ¾à&˜ž¸àÂ@;$°ß#®È;,;#ú›;/,#„OÅ;2Êà#ˆià¡s›ãÐàÖà Üà àqÖà Üà qÖà¦à , ¦à ÀÝ‘à°ß°ßÄà°ßqÉà¤ß¤ßâà¤ßiáF 0_Á1‚Ø#£ë2,#¨¾4,#Aá¡sµYiáoá uá YáFoá uá Foáçàçà{áçàðáòJ <x<ðá#< #Èá¡sãŒââ â àáòJâ â òJâ â  ï€á€áâ€á•âs­<x<ðá#< #î<3# mâ¡s­¡•â›â ¡â …âs­›â ¡â s­›âââ§ââãÿÏ<b.<ã#æâ¡sM“ã$ã *ã þâÿÏ$ã *ã ÿÏ$ã ã– ï¬â¬â0ã¬ârmäøp–#6esiz½,‰g>%þç èèç ï~èíJ >Vx>Wðá#>X #Vè¡s¼«~è„è Šè nèíJ„è Šè íJ„èèèèèeéøp>\6cw>]–#6sw>^–#6tag>_–#\Ž>`–# àö>a–#%9>b–#³ò>c–#6_st>deé#–M>e–#l=é¡s.–ué{é é Uéø{é é ø{é uéè ï•è•è‡é•èsF>i{é›Í>t¢é0ê›ÍX>mî>nóç#®%>qŒé#LqÀ>r–#P6cr2>s–#T$ž¢é ê¡s0ê6ê <ê%!êž6ê <ê&ž6ê¢é¢éBê¢érñêÄý\>x>y–#N»>zñê#·ž>{Ýç#š”>|¢é#˜>};#lá>~•è#ìÉê¡sw÷êñê ýê áêÄýñê ýê ÄýñêGêGêëGê¼b>Gêƒë9°?Ká@?Lƒë#·Œ?Mƒë#[ë¡sƒ¿‰ëƒë ë së9°ƒë ë 9°ƒëëë•ëë©ìË?bNb?hƒë#/?c3Í€?d!¶È?eIõë¡s î©ì¯ì µì ìË¯ì µì3&ìË?k¯ì ƒë3:ìË?o¯ì-Rì#?t<įì-jìG?y¾v¯ì/‹ì3?}šÔÑ(Àì µì1íº?äÐÑ(Àì µìšëšë»ìšë»ìCíÔ«@R$pNÆì!†¦@S!@T!øª@UØ@V í¡sø1CíIí Oí 3ípNIí Oí pNIíÆìÆìUíÆìàí¸A%‹‡A& #|Aàí‡mA'tí#­í¡s—õíûí î Åí¸ûí îJ¸A)ûí àíæíõí ZíZíîZí”î£#vcØo#‚Kã5‰$~í îEi#ƒ”î[#„šîlî¡s‘ècðið oð „î~íið oð ~íiðWcð‚â#}$Oöšî´o#~îM/#€3Í€#!Ø#‚ûíú×#ƒ²ú•:#„ýû+Î#…ü#†Zí0ï¡s2dü ü EóDEïOö#Œ üD_ïOö# ü EóDzïˆ# ü,@œï½#“‡ûíü õí@¾ï½#–R·²úü î@åï"¨#œ #ûí ü > M3Að‹p#«ø ü ûí >@%ðê#®UÑ3üAHð2#°-H ü ûí îE{¤#±.- ü ûí î îuð îño#vcØo#‚^5‰$~ízðEi#ƒñ[#„¾ñÚð¡sFÚÄñÊñ Ðñ òð~íÊñ Ðñ ~íÊñ¾ñÐ#á$=Öñ7ñ¡shæüü %ü Oñ=Öü %ü bñ=Öü/}ñ"¨#å "ó >U"¨#îË#"ó-ªñ‹p#ò€´ "ó >4‹p#ö1 "óØ4zðzðÖñzðÁòlW?Ö\Nb?"ó#$%3Ûñ[?šîEi?ñ8ò¡s ‘(ó.ó 4ó Pò%3.ó 4ó@mòKö?—šî?óD‡ò%3? .ó Eó?¥ò_þ?ªû"ó.óZGT? é.ó "ó"ó·?S9ë#º?TZí#$[ÛÁò ó¡sÏ‹0ü"ó 6ü [Û"ó 6üÁòÛñÛñ:óÛñ:óKóšî ôØN?&9Ûñ#$ŸPóMü?*Ûñ[?+šî§ó¡s¯, ôô ô ¿óŸô ôDÙóŸ?.ô EóDôóÿž?7ô,4§RBFr¢ôPóPóôPó²ú×?o9Pó#$&© ôMü?sPó?vZíØ?wûíú×?x²úu?y¸úÈ®?z¾ú­0?{Äú³0?|Êú•:?}Ðú+Î?~Õú/?3Í€?€![?šîuà?…Áò? õ(#?š§"óÚú î?(õ(#?¯öÕ"óÚúDBõ&©?ÄÚú EóDfõ&©?ÏÚú > î EóD€õ&©?ÛÚú >Dšõ&©?æÚú àúDµõXS?Úú,/Öõ¡sBƒÄ0ëúÚú àúAùõx?@WÚú > î@öKö?1˜¡šîñú@3öW‘?9Ú ¸úÚú@PöW‘?@¡œ¾úñúPmöend?GGl¸úÚúPŠöend?N˜Ÿ¾úñú@§ö„?U­ÊúÚú@Äö„?\‘ÒÄúñú@áö­9?dttÊúÚú@þö­9?måÄúñú@÷£Æ?tk¶Ñ(ñú@8÷šŽ?xuY3ñú@U÷ê?|3ñú-w÷Ë"BtuÚú > îA•÷Ë"?•´ÀÚú >@²÷ïÐ?rýõíÚú@Ï÷ïÐ?¤Ùîñú@ì÷Åž?«ícõíÚú@ øÅž?²TÓîñúA'øêÐ?¿HóÚú îA@øNø?Þ»òÚúA^øÀž?êCÚú îAwøò? àîÚú/ø¤·BXŒ;¸úÚú ¸ú îAÅø¤·??æ5Úú ¸ú > î/æøf Be8¸úÚú ¸ú@ ùf ?~Г¸úÚú ¸ú ¸úA+ù 3?ŽAÚú ëúADù©R?—ÙÚúAgùñ?Ÿ>ÜÚú ¸ú ëúAùñ?©SÞÚú ¸ú ëú ¸úA¼ùñ?µ!+Úú ¸ú ëú ¸ú ¸ú-ÙùB¶°­Úú î-ñù‘BÇÊ*Úú-únøBÚ_ßÚú ëúA'ú£Ö?åj.ÚúA@úö²B-Úú;cúxB˜Ü¤Úú > îNŒúšÑ?&3NÚú ¸ú > îZ—?/©-Úú ¸ú ¸ú ¸úî·ü#yõ£õíî ôæú ô ôæúæû¶òA327RAM ô#2%ÊANÑ(#ÀòAL ôLû¡sï…æûìû òû dû¶òìû òû-†ûõ¡A9ùBìû àí-£ûÕ{A>±ìû -»û©RAB_‰ìû3Ïû¶òAEìûJµòAIìû,÷ú÷úøû÷úõíîšîšîKóññ+üñÁò<üÁò@ý¾äAi2†ñAŽìû#|Awtí3{ü¾äAj@ý3”ü¾äAl@ý Fý/µü¡sAnkþQý@ý Fý3Ïü½äAp@ý,-ñüCÁA}ÐfWý àí-ý63Aƒ’“Wý -&ýªA†ãÓ@ýsÀòAxFìûWýAüLýAüAüLý±ýÉåC@‰ý¡sƒ¤±ý·ý ½ý ¡ýÉå·ý ½ý Éå·ý]ý]ýÃý]ý%þsCD9]ý#ýý¡sŸÞ%þ+þ 1þ þsC+þ 1þ sC+þÈýÈý7þÈýÿrÞE69Aü#†îEàí6±E@Qþ#ºIEFQþ#xÌEKQþ# ‰“ENQþ#õÐEQ #Âþ¡s²ÿ£ÿ ©ÿ ÚþrÞ£ÿ ©ÿ3ýþrÞET£ÿ àí àí àí3ÿ—üEW£ÿ,-/ÿ{¤EbØ£ÿ.KÿdupEhg£ÿ´ÿ-mÿ>;Epzý£ÿ àí-…ÿˆòEv+‡£ÿ1¶2E‹‹  <þ<þ¯ÿ<þ¯ÿ?Š)E‡¥AE‰£ÿ#ôÿ¡s q?E K Š)E K3%Š)EŽE £ÿ4hÔE” äV WýºÿºÿQºÿQáDE™¥AE›£ÿ#–¡sA×áç í ®Dç í3ÇDE ç £ÿ4hÔE¦ªMø Wý\\ó\ó×AEÚ9]ý#¥AE8£ÿ#ƒ”E;Ñ(#&°EÛ<þ|Eÿtí3[AEß×3tAEä× £ÿ3AEé× Ý3§@Eë×,/ñ¢EôUøÑ(è-å>;Eý Xè àíACÁEôkè àíA&63E ·5è @C£ÆEÑ(è@`e€EýiÑ(è@‚"…E!C+Ñ(× Ñ(@Ÿ …E&P‚Ñ(×A¸ˆòE+Ö‰×B¡sE4µ“î× Ýþãþãþ|k×#vcØo#‚5‰$~íôEi#ƒ|[#„‚T¡sáèKQ W l~íQ W ~íQ»K[›#}$Oö‚´o#~îM/#€3Í€#!Ø#‚×ú×#ƒè•:#„:+Î#…?#†þ¡s/îDJ YD-Oö#ŒJDGOö#J YDbˆ#J,@„½#“˜–×P î@¦½#– zèP Ý@Í"¨#œ†Ã×J > M3Að‹p#«d$J × >@ ê#®\n3PA02#°(]J × ÝE{¤#±9ßJ ×ôô]ôêZ*#vcØo#‚–p5‰$~íbEi#ƒê[#„¦Â¡sØG¬² ¸ Ú~í² ¸ ~í²¦º!#á$=Öê¡s=V\ b 7=Ö\ b J=Ö\/e"¨#å•£6 >U"¨#îÓ¤6-’‹p#òó# 6 >4‹p#öŠ› 6Xbb¾b©÷Ë?Ö\Nb?6#$%3Ã[?‚Ei?ê ¡sŽõ<B H 8%3B H@UKö?b£‚SDo%3? B Y?_þ?þ6BZGT?Ù`B 66–ç?S9ë#º?Tþ#$[Û©õ¡sÈ£K6 Q [Û6 Q [Û6 ZÛ6,©ÃÃNÃN_‚  ?&9Ã#$ŸdMü?*Ã[?+‚»¡s4 #  )  ÓŸ#  ) DíŸ?.#  YD ÿž?7# ,4§RBFî5# dd/ dƽ2?o9d#$&©4 Mü?sd?vþØ?w×ú×?xèu?yÆÈ®?zF­0?{Þ³0?|ä•:?}ê+Î?~ï/?3Í€?€![?‚uà?…©? (#?šµû6ô Ý?< (#?¯7µ6ôDV &©?Äô YDz &©?Ïô > Ý YD” &©?Ûô >D® &©?æô úDÉ XS?ô,/ê ¡sBƒÖåô úA x?ëô > Ý@* Kö?1ù;‚ @G W‘?9û²Æô@d W‘?@ F P end?GÏ€ÆôPž end?NAF @» „?UBNäô@Ø „?\ΈÞ @õ ­9?dŽ@äô@ ­9?mÀ¦Þ @/ £Æ?tðÑ( @L šŽ?x»3 @i ê?|å3 -‹ Ë"BtÈÞô > ÝA© Ë"?•\”ô >@Æ ïÐ?[òîô@ã ïÐ?¤@Ý @ Åž?«—)îô@ Åž?²I”Ý A; êÐ?¿7Íô ÝAT Nø?ÞSüôAr Àž?ê#Lô ÝA‹ ò? «ô/± ¤·BX—zÆô Æ ÝAÙ ¤·??ƒô Æ > Ý/ú f Be±&Æô Æ@!f ?~ "Æô Æ ÆA? 3?Ž‘˜ô AX©R?—èôA{ñ?ŸË·ô Æ A£ñ?©‚{ô Æ  ÆAÐñ?µ\—ô Æ  Æ Æ-íB¶™?ô Ý-‘BÇT„ô-"nøBÚÂô A;£Ö?åÐôATö²BZñô;wxB˜³ô > ÝN šÑ?&^ô Æ > ÝZ—?/ÒÎô Æ Æ ÆFá?9šë#$ðûÆu?‘ÆÈ®?’F[5?“Æ?•þØ?–ו:?—muà?˜©Q¡sßrx ~3jðû?›x 63~ðû?Ÿx3—ðû?¢x ~/³s?§Xî‰/Ïòë?¬T¸×‰/ë^á?°Þrrx/ ^á?·/rÆx ,/(ýê?¿-Þrx1ýê?Æ"ÝÆx ,Þ6j?9šë#$ðûFu?‘ÆÈ®?’F[5?“F?•þØ?–è•:?—uà?˜©Ñ¡s ¡”š   éðûš  3ðû?›š 63ðû?Ÿš3/ðû?¢š ~/Ks?§‹Ý«/gòë?¬è«/ƒ^á?°»”š/¤^á?·P.Fš ,/Àýê?¿N'”š1ýê?Æ‹¦Fš ,c%+oîÝ4 4 4 .²¥ F-Í$F„Å#GhF‰Å#mªFŒÑ(#+•F4 #/F.3¾dF/4 ø—F0Æò—F1F¡¡sH9.4 : ¹²¥4 : Ò±¥4,3æ²¥F34-þ•:F=K4-é~FAª4-.¸ÐFGà«4-Fç~FN Z4/b£ÆFWiÄÑ(E-z©RFZpp4/–šŽF_Aí3E/·‹òFep@Æ4 Ý/ݤ·Fl˜´Æ4 Æ Ý/þf Fr“)Æ4 Æ-+¨Fuß.41¶2F–   @@©W©ÞzËF”èF–4#–¡s1Þä ê ®zËä ê3ÇzËFœä EJyËF¡ä,\\ð\¹dF¬2+•FÁ#2&•FÂ4 #¾dF­4 uF®ÆÈ®F¯F`¡s^î# ) x¹d# )3‘¹dF±# 3«¸dF·#,/ÇW‘F»)ŒÆ#.ãendF¼Ú÷Æ#/ÿW‘F½°zF4tendF¾^F4õõ/õ/îÝ‚‚_êêhêîÆÆ„Æ„ÝFF¦F¦/vŠFí9Aü#\…wF&4#/Fî3ø—FÆ3vŠFð/3vŠFò/ 534uŠFô/,/U¡sFöp@/ 5/q£ÆFüßpÑ(F-‰©RFÿOI/@¦šŽF! 3F?É‹òF³ÛÆ/ Ý?ñ¤·F]™Æ/ Æ Ý?f F›AÆ/ ÆglF#Y÷4F±;±±;útGó$Ö=LºýGôLC…ÍGõ1Göúø—G÷FíGøº¡sŒí  ÒÖ=  åÖ=EN[Gÿrc 4xé £ÿLL#L¿n“H)2² H{×#3Wn“H+¿3pn“H0¿ Å3‰n“H=¿ î/ª¡sHB»oп Å3Äm“HK¿,/à£ÆHP.ÔÑ(Ö/üþ_HUuÑ(Ö/e€HZÕÑ(Ö/9"…HaÉ“Ñ(¿ Ñ(/U …Hf_Ñ(¿-mˆòHi1¡¿/‰±¢Hn *Ñ(¿/¤¶2Hs ï  XÑHv; ¿ ×(Ë((ËKYpI$+!³I$—$$QyÜ#¡sè¢KQ W ;QyQ W QyQÜÜ]Ü¿†-J%9Èý#—¡s»¿Å Ë ¯†-Å Ë †-ÅbbÑbR¯K 9b#!…ÍK¡sñôRX ^ *¯X ^ =¯X4hÔKiÖÖdÖdë¯KT9b#!…ÍKX«¡s#ïëñ ÷ ïñ ÷ Ö¯ñ4hÔKZ”ðooýoý„&¯K”9b#!…ÍK˜D¡sŸè„Š  \&¯Š  o&¯Š4hÔKšŽ›––5¯KË9b#!…ÍKÏÝ¡sqã# ) õ5¯# ) 5¯#4hÔKÑèD4¡¡/¡/¶D¯Kù9b#!…ÍKýv¡s¡Ü¶¼  ŽD¯¼  ¡D¯¼4hÔKÿæöÍ::È:ÈR S¯K9b#C…ÍK" ¡smÕR X  ^  ) S¯X  ^  < S¯X EhÔK$K­i ÓÓd Ód î b¯K:9b#C…ÍK>­ ¡sŒÑî ô  ú  Å b¯ô  ú  Ø b¯ô EhÔK@ˆb!o o !o !_!Ú=LL7!¡shí_!e! k! O!Ú=e! k! Ú=e! ! !q! !Ê!æ‰LM¢!¡sì‹Ê!Ð! Ö! º!æ‰Ð! Ö! æ‰Ð!v!v!Ü!v!5"ÇLN "¡s¿y5";" A" %"Ç;" A" Ç;"á!á!G"á! "ƒLOx"¡sA† "¦" ¬" "ƒ¦" ¬" ƒ¦"L"L"²"L" #æƒLPã"¡sµ¾ ## # û"æƒ# # æƒ#·"·"#·"v#g-LQN#¡sŠv#|# ‚# f#g-|# ‚# g-|#"#"#ˆ#"#á#qLR¹#¡s²çá#ç# í# Ñ#qç# í# qç###ó##L$r¨LS$$¡sW"L$R$ X$ <$r¨R$ X$ r¨R$ø#ø#^$ø#'·$or_LT$¡s²U·$½$ Ã$(§$or_½$ Ã$)or_½$c$c$É$c$"%gÔLUú$¡s"%(% .% %gÔ(% .% gÔ(%Î$Î$4%Î$%ãoLVe%¡sª%“% ™% }%ão“% ™% ão“%9%9%Ÿ%9%ø%ÎÔLWÐ%¡s¿ïø%þ% & è%ÎÔþ% & ÎÔþ%¤%¤% &¤%c&+LX;&¡s$óc&i& o& S&+i& o& +i&&&u&&Î&ðÉLY¦&¡sº Î&Ô& Ú& ¾&ðÉÔ& Ú& ðÉÔ&z&z&à&z&9'‹PLZ'¡s639'?' E' )'‹P?' E' ‹P?'å&å&K'å&¤'‡PL[|'¡s±¤'ª' °' ”'‡Pª' °' ‡Pª'P'P'¶'P'(Ý/L\ç'¡sìð(( ( ÿ'Ý/( ( Ý/(»'»'!(»'z(xL]R(¡s…hz(€( †( j(x€( †( x€(&(&(Œ(&(å(<ÉL^½(¡soå(ë( ñ( Õ(<Éë( ñ( <Éë(‘(‘(÷(‘(P)bL_()¡s¶ÑP)V) \) @)bV) \) bV)ü(ü(b)ü(»)ë—L`“)¡s§ú»)Á) Ç) «)ë—Á) Ç) ë—Á)g)g)Í)g)&*—Laþ)¡sß&*,* 2* *—,* 2* —,*Ò)Ò)8*Ò)‘*½Lbi*¡sâ‘*—* * *½—* * ½—*=*=*£*=*ü*¨wLcÔ*¡s`ü*+ + ì*¨w+ + ¨w+¨*¨*+¨*g+â~Ld?+¡sòÈg+m+ s+ W+â~m+ s+ â~m+++y++Ò+yÉLeª+¡sÿÒ+Ø+ Þ+ Â+yÉØ+ Þ+ yÉØ+~+~+ä+~+=,KLf,¡s^;=,C, I, -,KC, I, KC,é+é+O,é+±,³ˆL¡$ô&T,‰,¡s—̱,·, ½, ¡,ô&·, ½, ô&·,T,T,Ã,T,%-þLª$ô&È,ý,¡sÉØ%-+- 1- -ô&+- 1- ô&+-È,È,7-È,™-ã}L³$ô&<-q-¡sÈ™-Ÿ- ¥- ‰-ô&Ÿ- ¥- ô&Ÿ-<-<-«-<- .É}L¼$ô&°-å-¡s̹ .. . ý-ô&. . ô&.°-°-.°-.×LÅ$ô&$.Y.¡s{S.‡. . q.ô&‡. . ô&‡.$.$.“.$.õ.×”LÎ$ô&˜.Í.¡sÀõ.û. / å.ô&û. / ô&û.˜.˜./˜.i/ȪL×$ô& /A/¡sЭi/o/ u/ Y/ô&o/ u/ ô&o/ / /{/ /Ý/µlLà$ô&€/µ/¡sŸXÝ/ã/ é/ Í/ô&ã/ é/ ô&ã/€/€/ï/€/Q0“ZLé$ô&ô/)0¡s¢,Q0W0 ]0 A0ô&W0 ]0 ô&W0ô/ô/c0ô/Å0ŸÇLò$ô&h00¡sw¨Å0Ë0 Ñ0 µ0ô&Ë0 Ñ0 ô&Ë0h0h0×0h091œLû$ô&Ü01¡s.=91?1 E1 )1ô&?1 E1 ô&?1Ü0Ü0K1Ü0®1¼L$ô&P1†1¡sdô®1´1 º1 ž1ô&´1 º1 ô&´1P1P1À1P1#2täL $ô&Å1û1¡sÈ#2)2 /2 2ô&)2 /2 ô&)2Å1Å152Å1˜2›L$ô&:2p2¡s¿d˜2ž2 ¤2 ˆ2ô&ž2 ¤2 ô&ž2:2:2ª2:2 3”L$ô&¯2å2¡sÛz 33 3 ý2ô&3 3 ô&3¯2¯23¯2‚3L($ô&$3Z3¡s¿ÿ‚3ˆ3 Ž3 r3ô&ˆ3 Ž3 ô&ˆ3$3$3”3$3÷3 L1$ô&™3Ï3¡sº(÷3ý3 4 ç3ô&ý3 4 ô&ý3™3™3 4™3l4½tL:$ô&4D4¡sel4r4 x4 \4ô&r4 x4 ô&r444~44á4ŠLC$ô&ƒ4¹4¡sjÈá4ç4 í4 Ñ4ô&ç4 í4 ô&ç4ƒ4ƒ4ó4ƒ4V5 OLL$ô&ø4.5¡s¶3V5\5 b5 F5ô&\5 b5 ô&\5ø4ø4h5ø4Ë5ÛlLU$ô&m5£5¡sˆË5Ñ5 ×5 »5ô&Ñ5 ×5 ô&Ñ5m5m5Ý5m5@6tøL^$ô&â56¡sH@6F6 L6 06ô&F6 L6 ô&F6â5â5R6â5µ6$òLg$ô&W66¡sËžµ6»6 Á6 ¥6ô&»6 Á6 ô&»6W6W6Ç6W6*7$ÛLp$ô&Ì67¡sB&*707 67 7ô&07 67 ô&07Ì6Ì6<7Ì6Ÿ7œ=Ly$ô&A7w7¡sKuŸ7¥7 «7 7ô&¥7 «7 ô&¥7A7A7±7A78ÚL‚$ô&¶7ì7¡sŸŽ88 8 8ô&8 8 ô&8¶7¶7&8¶7‰8…lL‹$ô&+8a8¡s‘l‰88 •8 y8ô&8 •8 ô&8+8+8›8+8þ8oL”$ô& 8Ö8¡sÅÚþ89 9 î8ô&9 9 ô&9 8 89 8s9>>L$ô&9K9¡sÃÏs9y9 9 c9ô&y9 9 ô&y999…99è9xL¦$ô&Š9À9¡s¬šè9î9 ô9 Ø9ô&î9 ô9 ô&î9Š9Š9ú9Š9]:ímL¯$ã÷ÿ95:¡s1¨]:c: i: M:ã÷c: i: ã÷c:ÿ9ÿ9o:ÿ9Ò:üL¸$ã÷t:ª:¡s‡–Ò:Ø: Þ: Â:ã÷Ø: Þ: ã÷Ø:t:t:ä:t:G;¬LÁ$ã÷é:;¡sÓÒG;M; S; 7;ã÷M; S; ã÷M;é:é:Y;é:¼;?LÊ$ã÷^;”;¡sg>¼;Â; È; ¬;ã÷Â; È; ã÷Â;^;^;Î;^;1<f LÓ$ã÷Ó; <¡s‹1<7< =< !<ã÷7< =< ã÷7<Ó;Ó;C<Ó;¦<rLÜ$ã÷H<~<¡sÚì¦<¬< ²< –<ã÷¬< ²< ã÷¬<H<H<¸<H<=ó:Lå$ã÷½<ó<¡s€r=!= '= =ã÷!= '= ã÷!=½<½<-=½<»=Y‰@$pN2=†¦@/»=@0Á=øª@1Ì=Ø@2Ñ=“=¡s;Ò×=Ý= ã= «=pNÝ= ã= pNÝ=£!Æ=»=Æ=»=2=2=é=2=Æ>DêMï9þ#$1.î=…ÍMñÑ(¯ MòÆ>&°M÷<þíMùË> V>0.å>,@x>hÔM«ôÑ(ë> Æ=D>1.Må>D§>1.Må> ö>B¡sMòü>å> ö>Æ=Ñ>å>Ñ( £ÿ Æ=î=ñ>î=ñ>î=’?5þMC9î=#$}÷?~XM|î=M?¡sõ°’?˜? ž? f?.˜?,D{?}÷M~˜?G}÷Mˆ˜? ž???¤??d@’óG$ø©?ºýGJ©?…ÍGKÑ(1GL?ø—GMFíGNË>@¡s’‰d@j@ p@ 3@øj@ p@ F@øj@BN[GYê%Ñ( 4 Æ=©?©?v@©?uC G¦2ñGø4#$¾d{@1G§?•:G©uC+ÎGªzCuG¬CÈ®G­OE³0G®UE­0G¯[E A¡s®_aEgE mE $A¾dgE mE38A¾dG²gE3QA¾dGµgE 4/mAW‘G¸“áCgE/‰AW‘G»:OExE.¥AendG¾èîCgE.ÁAendGÁ:ñOExE/ÝA„GÄ„jUEgE/ùA„GÇš?[ExE/B­9GÊH–UEgE/1B­9GÍNÇ[ExE/MBïÐGУ&’?gE/iBïÐGÓF~ž?xE/…BÅžGÖá‚’?gE/¡BÅžGÙìÇž?xE/ÇB¤·Gܾ9CgE C ž?-äBêÐGß,fgE ž?-CÀžGâ ?gE ž?/"Cf Gå{†CgE C/HCf Gè…ÀCgE C C-`CNøGïægE4òGòG-gE’?ž?OE’G6i_GWÆ#$cC/G3Í€G !¶ÈG!I1G#?G%?ØG&˜?•:G'm•ø—G)ÆD¡sÀar•x• ~• 1Dcx• ~•3EDcG,x•3^DcG/x• ~/zDsG2wª’?‰•/–DòëG5èA˜?‰•/²D^áG8$ür•x•/ÓD^áG>¸Cx• ,/ïDýêGEÃâr•x•/EýêGKpr•x• ,/1E3GRúÑ(‰• ~•1íºGU‘eÑ(‰• ~•hj Ÿß¼{@{@sE{@sE+GñGŠ9±#$CR~EBIGŒ©?…ÍGÑ(1GŽ?,2G{@uGCÈ®G‘OE³0G’UE­0G“[E¾dGš{@)F¡s†Ë+G1G 7G BFBR1G,@dF‹òG©ÊC1G ž?@†FN[G¶¶cÑ(BG Æ=@¨FhÔGº0ôÑ(BG Æ=@ÅF'GÄ´|HGBG@âF"GË4;{@1G@ÿF"GÒ'sEBGDGCRGÔ1GGCRG×1G 7G~E~E=G~E=GÆÖG*`#vcØo#‚È5‰$~íNGEi#ƒÖG[#„ÜG®G¡s9ÿâGèG îG ÆG~íèG îG ~íèG<±u²NGNGôGNGI}] NN24NxI#2âðNyI#2e®NzI#$@ÞùG[NnÜGEiN|ÖGqH¡sh¡I I I ‰H@Þ I I/¥HKöNqâÜGI3¾H@ÞNt I #IMàH¨N+I I >XˆpN‚,ð I I > ùGùGIùGI)IÜGèI N9ùG#$dä.IMüN“ùG[N”ÜG‚I¡s}&èIîI ôI šIdäîI ôI3³IdäN—îI #I3ÑIdäNšîI > #IJcäN¢îI,.I.IúI.IäOxÆ Nº9.I#$™<ÿIMüN¾.ISþN¿ÿIN ØNÃIú×NÄäOuNÅïOÈ®NÇõO­0NÈûO³0NÉP•:NÊP+ÎNËP/NÌ3Í€NÍ![NÎÜG3ÐJ™<NåP #I3óJ™<NðP > P #I3 K™<NüP >D&K™<N P #PDAK˜<N)P,/bK¡sO€âj.PP #PA…KxNB"ÇP > P@¢KKöN[À˜ÜG4P@¿KW‘NcôFïOP@ÜKW‘Nkf°õO4PPùKendNsûxïOPPLendNzj$õO4P@3L„N‚-¼PP@PL„NŠÃ)ûO4P@mL­9N’_OPP@ŠL­9Nš¬äûO4P@§LšŽNŸ®Ì34P@ÄLêN£§34PAçLË"N² ÞP > PAMË"NÄéÝP >@"MÞëNÌ€34P@?M£ÆNÓóÄÑ(4P-\MFÇOF¦”P >@~M½®Nõ•» PP >@ M½®N8sP4P >N¿Mâ¡N  84P >PàMatNV¨ PP >PNatN)¤ÕP4P >@NïÐN0âÊ PP@;NïÐN7qèP4P@XNÅžN>  PP@uNÅžNEHAP4PA“NÀžNT «P PA¬NòNhhðP/ÒN¤·OYÁßïOP ïO PAúN¤·NŸxBP ïO > P/Of Oi˜ïOP ïO/AOf Ou[ïOP ïO ïOA_O 3NêZ0P .PAxO©RN÷é@P;›OxOŸþ|P > PNÄOšÑO5ç P ïO > PXòoOßVˆP ïO PêO {ÿe§<~ù P PêOÿI)PÿIÿI)PÂPõÀ#vcØo#‚ïR5‰$~í:PEi#ƒÂP[#„ÈPšP¡sBËÎPÔP ÚP ²P~íÔP ÚP ~íÔP^°Ñ9:P:PàP:PìQÃß NN24NxìQ#2âðNyìQ#2e®NzìQ#$@ÞåP[NnÈPEiN|ÂP]Q¡s/¿òQøQ þQ uQ@ÞøQ þQ/‘QKöNqÔæÈP R3ªQ@ÞNtøQ RMÌQ¨N°¨ìQøQ >XˆpN‚mIøQ ìQ >Ñ=åPåPRåPRRÈPÔR‡Ÿ N9åP#$däRMüN“åP[N”ÈPnR¡s›-ÔRÚR àR †RdäÚR àR3ŸRdäN—ÚR R3½RdäNšÚR > RJcäN¢ÚR,RRæRRÐXyU Nº9R#$™<ëRMüN¾RSþN¿ëRNÂÑ=ØNÃìQú×NÄÐXuNÅÛXÈ®NÇáX­0NÈçX³0NÉíX•:NÊóX+ÎNËþX/NÌ3Í€NÍ![NÎÈP3¼S™<Nå Y R3ßS™<Nð Y > Y R3øS™<Nü Y >DT™<N  Y YD-T˜<N) Y,/NT¡sO€ñÝY Y YAqTxNBÖ Y > Y@ŽTKöN[SëÈP Y@«TW‘Nc“nÛX Y@ÈTW‘NkoöáX YPåTendNsH‡ÛX YPUendNz?ÕáX Y@U„N‚»LíX Y@ YAñUË"NÄ.m Y >@VÞëNÌb3 Y@+V£ÆNÓ^8Ñ( Y-HVFÇOFÄ Y >@jV½®NõgŽøX Y >@ŒV½®No®Y Y >N«Vâ¡N ¿Å Y >PÌVatN•¹øX Y >PíVatN)!Y Y >@ WïÐN0®øX Y@'WïÐN76´Y Y@DWÅžN>: øX Y@aWÅžNE°ãY YAWÀžNTfÛ Y YA˜WòNhÙY Y/¾W¤·OYÅhÛX Y ÛX YAæW¤·NŸ©Ñ Y ÛX > Y/Xf OiVbÛX Y ÛX/-Xf OunÛX Y ÛX ÛXAKX 3Nê×® Y YAdX©RN÷ª Y;‡XxOŸ=Y Y > YN°XšÑO5b Y ÛX > YXòoOßJ% Y ÛX YÖXÑ=ÿí]—XøzøXÑ=YÖXëRYëRëRY®YHÇ#vcØo#‚¿ú5‰$~í&YEi#ƒ®Y[#„´Y†Y¡soºYÀY ÆY žY~íÀY ÆY ~íÀYÒRð³&Y&YÌY&YØZ^R NN24NxÞZ#2âðNyÞZ#2e®NzÞZ#$@ÞÑY[Nn´YEiN|®YIZ¡s·êZðZ öZ aZ@ÞðZ öZ/}ZKöNqœ¯´Y[3–Z@ÞNtðZ [M¸Z¨NiÞZðZ >XˆpN‚,:ðZ ÞZ >¤äZØZÑYÑYüZÑYüZ [´YÌ[âæ N9ÑY#$dä[MüN“ÑY[N”´Yf[¡sˆ`Ì[Ò[ Ø[ ~[däÒ[ Ø[3—[däN—Ò[ [3µ[däNšÒ[ > [JcäN¢Ò[,[[Þ[[Èa¦p Nº9[#$™<ã[MüN¾[SþN¿ã[NÂäZØNÃÞZú×NÄÈauNÅÓaÈ®NÇÙa­0NÈßa³0NÉåa•:NÊëa+ÎNËöa/NÌ3Í€NÍ![NδY3´\™<Nåb [3×\™<Nðb > ûa [3ð\™<Nüb >D ]™<N b bD%]˜<N)b,/F]¡sO€ÌWbb bAi]xNB“³b > ûa@†]KöN[* ´Yb@£]W‘NcÒçÓab@À]W‘NkTsÙabPÝ]endNsOLÓabPú]endNzSÙab@^„N‚¼„åab@4^„NŠ}«ßab@Q^­9N’±°åab@n^­9NšËëßab@‹^šŽNŸ«»3b@¨^êN£·ÿ3bAË^Ë"N²8ub > ûaAé^Ë"NÄN§b >@_ÞëNÌmu3b@#_£ÆNÓ‹Ñ(b-@_FÇOF±ðb >@b_½®NõJYðab >@„_½®NÛèûab >N£_â¡N 38b >PÄ_atNÞIðab >På_atN)Õ®ûab >@`ïÐN0G,ðab@`ïÐN7Q]ûab@<`ÅžN>Êžðab@Y`ÅžNE7#ûabAw`ÀžNT*/b ûaA`òNhUmb/¶`¤·OYdaÓab Óa ûaAÞ`¤·NŸF!b Óa > ûa/ÿ`f Oi ¾Óab Óa/%af OuÉ[Óab Óa ÓaACa 3Nê>ýb bA\a©RN÷áøb;axOŸõœb > ûaN¨ašÑO5…¼b Óa > ûaXòoOßÁMb Óa ûaÎaäZZÊìÜy½VðaäZûaÎaã[ bã[ã[ bÐe4\LP"2úëPF #2‹5PGÿI#2øbPI #2ù7PJÑ(#2¬gPKëR#2ŤPLã[#$2Œ˜PM#02R*PNÑ(#423PO,#82+¥PPÑ(#<2žPQÿI#@ïb¡slEÐeÖe Üe3c4\P$Öe P3&c4\P%Öe P #P3?c4\P&Öe Üe3Yc3\P'Öe,-qc€,P)ù™Öe/’cÔ.P*>ÌÐeÖe P-ªc§äP,"¼Öe-Çc8£P-ÑÖe ,-ßcLÔP.S†Öe-÷c›P/µ Öe/dä©P1=¥ çe//d ìP2 çe/KdT‡P3ŽÒ,çe/gdmP5s#Pçe/ƒdÑ/P6£:Yçe/ŸdÖàP7±bçe/ÀdâJP8G¥Ñ=çe P/ád¤3P9«äZçe P/ýdSTP;¢¤#Pçe;exÏP={Öe;/e0,P>X‹Öe;MeÈhP?öÓÖe P;fe{iP@·HÖe;e&´PAà>Öe;˜e%ËPBk?Öe;±eóÇPC(øÖes–PD·ìÑ(Öe Æ=bbâebâevf0S@$pNíe†¦@/b@0vføª@1{fØ@2ÖeNf¡s\)€f†f Œf ffpN†f Œf pN†fÐeÐeíeíe’fíeog©JMï9þ#$1.—f…ÍMñÑ(¯ Mòog&°M÷<þíMùtg ÿf0.Žg,@!ghÔMüÑ(”g ÐeD6g1.MŽgDPg1.MŽg ŸgB¡sM&!¥gŽg ŸgÐezgŽgÑ( £ÿ Ðe—fšg—fšg—f;h{NMC9—f#$}÷«g~XM|—fög¡s;hAh Gh h.Ah,D$h}÷M~AhG}÷MˆAh Gh«g«gMh«g izºG$øRhºýGJRh…ÍGKÑ(1GL«gø—GMFíGNtgÄh¡s^¥ ii i Ühøi i ïhøiBN[GY±aÑ( 4 ÐeRhRhiRhlÜ¿G¦2ñGø4#$¾d$i1G§«g•:G©l+ÎGª#luG¬(lÈ®G­øm³0G®þm­0G¯nµi¡sIœ nn n Íi¾dn n3ái¾dG²n3úi¾dGµn 4/jW‘G¸/(ln/2jW‘G»µsøm!n.NjendG¾{Y(ln.jjendGÁž>øm!n/†j„GÄ%¬þmn/¢j„GÇï×n!n/¾j­9GÊ(Dþmn/Új­9GÍl…n!n/öjïÐGЧí;hn/kïÐGÓ òGh!n/.kÅžGÖ'Í;hn/JkÅžGÙdtGh!n/pk¤·Gܽ%(ln (l Gh-kêÐGß^Sn Gh-ªkÀžGâ|¿n Gh/Ëkf Gåè(ln (l/ñkf Gè°»(ln (l (l- lNøG裡n4òGòÌ¿n;hGhøm]G6i_GWÆ#$c(l/G3Í€G !¶ÈG!I1G#«gG%«gØG&Ah•:G'‡–ø—G)ÆÂl¡s 'Œ–’– ˜– Úlc’– ˜–3îlcG,’–3mcG/’– ~/#msG2ž1;h£–/?mòëG5ÒAh£–/[m^áG8,µŒ–’–/|m^áG>˳(l’– ,/˜mýêGEã$Œ–’–/¹mýêGKr#Œ–’– ,/Úm3GRm"Ñ(£– ˜–1íºGU«1Ñ(£– ˜–Ë?÷A $i$in$inÔocÏGŠ9±#$CR'nBIGŒRh…ÍGÑ(1GŽ«g,2G$iuG(lÈ®G‘øm³0G’þm­0G“n¾dGš$iÒn¡s+ÔoÚo ào ënBRÚo,@ o‹òG©Ö2(lÚo Gh@/oN[G¶MÑ(ëo Ðe@QohÔGºN<Ñ(ëo Ðe@no'GÄžÃñoëo@‹o"GËëu$iÚo@¨o"GÒåEnëoD½oCRGÔÚoGCRG×Úo ào'n'næo'næoÛâpî|#vcØo#‚&C5‰$~í÷oEi#ƒp[#„…pWp¡s‘Ä‹p‘p —p op~í‘p —p ~í‘p¤þÈ÷o÷op÷o*q^m#vcØo#‚Ÿ‡5‰$~í¢pEi#ƒ*q[#„0qq¡sÒu6q}³0(ÂD}@†uKö(^s*…pJ}?©u(#(gE§:rU} ,}?ÌuñF(uºw:rU} :rNëuÙg(â0U} :r? v:I(ˆ—c[}J}?'v —(‹‚Š[}J}?EvžÁ(Žë[}J}?bvü\(‘æ[} :r?vv›(”G9[} :r?œvr¥(—/[} :r?¹v³(š·+!} :r?Öv's(:wP :r?óvÑ-( äa} :r?wü\(£R\[} =Š?-wv›(¦Dº[} =Š?Jwr¥(©òq[} =Š?gw³(¬e•!} =Š?„w's(¯[ÅP =Š?¡wÑ-(²÷‰a} =Š?¾wð(¶ûŒ:r :r?Ûw4(º'À:r :r?x¡·(Ñ©¥2}U} =Š =Š ,}?0x™Ý(ª¨Á:rU} :r :rNOxc (ͨÅU} :rDdxéÈ(ÑU}D~xéÈ(ÕU} MtDxéÈ(ÙU} Mt ]rD·xéÈ(ÝU} g}DÒxèÈ(ìU},@ôx¡s(´›îm}U} g}Ny.N(ótU}@+yb(þìÕµsJ}@HyW‘(«n2}U}@eyW‘(a 8}J}P‚yend(¢2}U}PŸyend( GÙ8}J}@¼y„( ÃöD}U}@Ùy„(Ê >}J}@öy­9(U3D}U}@z­9(ñÒ>}J}@0z£Æ(WÝÑ(J}@MzšŽ(€ƒ3J}@jzê( 3J}Aˆz 3(#ˆ$U} m}@ªzŠ( Ûs}U} ,}@Ìz¿F(ùEd2}U} ,}@ózŠ(&»S2}U} 2} ,}@{¿F(P»g2}U} 2} ,}A8{f (6|U} 2}@Z{f (ž&V3U} PA}{f (Ý\\U} 2} 2}A {f (é>lU} äO äOA¹{©R(L¾¥U}@Û{±3(òc2}U} P@ý{±3(:õ8}J} P@|ÉZ(‚å3J} P@A|’-(&“©2}U} P@c|’-(8®38}J} P@…|´‡(J"É2}U} P@§|´‡(\âT8}J} P@É|w®(prBy}U} P@ë|w®(yÃA}J} PBð(”+ÝÑ(J}ˆ¼}}}!}},}}÷ Pe˜P}^t^t:rW‰P}^t|;ù€C©‚Ü R\2bŽRx^t#map…}vIRb ³Rc,Rd}ÆuReµsØ$*†Rv^t[R}…p•:R~©‚+ÎR®‚uR€2}È®R8}/R‚3Í€Rƒ!ØR„ }ú×R…}³0R†D}­0R‡>} x~¹g³‚,uŒ~mapR³‚uª~mapR˜³‚ Mt ]ruÃ~mapR¢³‚ ¹‚/ä~¡sRÕ­>Ä‚³‚ ¹‚/KöRÜž’…pÊ‚/W‘Rä¡ü2}³‚/8W‘RìÀ8}Ê‚.TendRóV2}³‚.pendRûš¹8}Ê‚@„Rz#D}³‚@ª„R :>}Ê‚@Ç­9R¯bD}³‚@ä­9R^H>}Ê‚@€£ÆR;Ñ(Ê‚@€šŽR#T¢3Ê‚@;€êR'Ñs3Ê‚@]€½®R8ûÔO³‚ P@€¤·RT} s}³‚ ,}@¦€¤·RlÒ2}³‚ 2} ,}AÄ€f R…í$³‚ 2}@æ€f R“È_3³‚ PA f R 'v³‚ 2} 2}A' 3R®ËS³‚ Ä‚A@©RR·  ³‚@]bR¾5EµsÊ‚@z){RÅßÃÕ}Ê‚@œ±3RÔñU2}³‚ P@¾±3Râ à8}Ê‚ P@àÉZRîNZ3Ê‚ P@‚’-RüË·2}³‚ P@$‚’-R Q¯8}Ê‚ P@F‚´‡R­Ð2}³‚ P@h‚´‡R ÔÌ8}Ê‚ P@Š‚w®R3;By}³‚ PBw®RF·}Ê‚ P!},}…}¿‚…}…}¿‚XƒÚH#vcØo#‚LM5‰$~íЂEi#ƒXƒ[#„^ƒ0ƒ¡sðŽdƒjƒ pƒ Hƒ~íjƒ pƒ ~íjƒ8pЂЂvƒЂ‚„V» NN24Nx‚„#2âðNy‚„#2e®Nz‚„#$@Þ{ƒ[Nn^ƒEiN|Xƒóƒ¡sÑÁˆ„Ž„ ”„ „@ÞŽ„ ”„/'„KöNqYö^ƒŸ„3@„@ÞNtŽ„ ¥„Mb„¨N¡U‚„Ž„ >XˆpN‚-Ž„ ‚„ >Öe{ƒ{ƒš„{ƒš„«„^ƒj…ÁÖ N9{ƒ#$dä°„MüN“{ƒ[N”^ƒ…¡sà j…p… v… …däp… v…35…däN—p… ¥„3S…däNšp… > ¥„JcäN¢p…,°„°„|…°„f‹>¿ Nº9°„#$™<…MüN¾°„SþN¿…NÂÖeØN„ú×NÄf‹uNÅq‹È®NÇw‹­0NÈ}‹³0NɃ‹•:Nʉ‹+ÎNË”‹/NÌ3Í€NÍ![NÎ^ƒ3R†™<N埋 ¥„3u†™<N🋠> ™‹ ¥„3Ž†™<NüŸ‹ >D¨†™<N Ÿ‹ ¥‹DƘ<N)Ÿ‹,/䆡sO€1»°‹Ÿ‹ ¥‹A‡xNBàŸ‹ > ™‹@$‡KöN[æ¯^ƒ¶‹@A‡W‘Nc|Lq‹Ÿ‹@^‡W‘Nk±Dw‹¶‹P{‡endNslïq‹Ÿ‹P˜‡endNz[Èw‹¶‹@µ‡„N‚/°ƒ‹Ÿ‹@Ò‡„NŠäœ}‹¶‹@9N’›¯ƒ‹Ÿ‹@ ˆ­9Nš7Ë}‹¶‹@)ˆšŽNŸ 3¶‹@FˆêN£43¶‹AiˆË"N²Ó{Ÿ‹ > ™‹A‡ˆË"NÄÿŸ‹ >@¤ˆÞëNÌét3¶‹@Áˆ£ÆNÓD`Ñ(¶‹-ÞˆFÇOFã‚Ÿ‹ >@‰½®Nõ®«Ž‹Ÿ‹ >@"‰½®N(™‹¶‹ >NA‰â¡N ¬m¶‹ >Pb‰atN掋Ÿ‹ >Pƒ‰atN)((™‹¶‹ >@ ‰ïÐN08‹Ž‹Ÿ‹@½‰ïÐN7^‚™‹¶‹@ډŞN>'ÐŽ‹Ÿ‹@÷‰ÅžNE‘‚™‹¶‹AŠÀžNT°;Ÿ‹ ™‹A.ŠòNhSŽŸ‹/TŠ¤·OY6<q‹Ÿ‹ q‹ ™‹A|Š¤·NŸ¦ÍŸ‹ q‹ > ™‹/Šf Oi Ôq‹Ÿ‹ q‹/Êf OuhTq‹Ÿ‹ q‹ q‹Aአ3NênµŸ‹ °‹AúŠ©RN÷Ý€Ÿ‹;‹xOŸnˆŸ‹ > ™‹NF‹šÑO5¡Ÿ‹ q‹ > ™‹XòoOßíôŸ‹ q‹ ™‹l‹Öe«K$à…‘dŽ‹Öe™‹l‹…«‹……«‹rðŽ§°S,–:SA'n#§ÔT“ðŽùŸSC׋#L£SEHÈ 2l¬SH¤ß#œ2‡SI¤ß#¨2ž6SJ¤ß#´28êSLÑ(#À2r½SMëR#Ä2ðSNã[#Ð2•îSO,#Ü2âASP #à2ÆñSQ…}#ä2lUSR…#ð2Ó¢SSÑ(#üÒŒ¡s¢ßöŽüŽ  ꌧ°üŽ 3þŒ§°S.üŽ3§°S/üŽ , 36¦°S0üŽ,vXaddS2ÈäüŽ Ñ= ,vzaddS3ÀTüŽ äZ ,v—addS4PéüŽ Öev´runS5šaüŽ ,/Ð2‹S6}ªÑ(üŽ-è$6S=bçüŽ/ Ž}ìS>xÂ,  /*Ž´wS?‚_Ñ(üŽ ,;HŽþQSUxeüŽ ,MeŽ7TSV÷¸  ;~Ž:¯SWÉüŽ;—ŽwìSXêàüŽMÃŽ{àSY¢ž,  1 1 ÔO;ÛŽ­ÎSZ„ ,Xí?S[q ,ê伋¼‹¼‹—dw_F^ÖäÑ(葱’Uxp_Vystr ‘Xzµdô‘ ’{n|ô‘ ’{‰{”{ |·ô‘ü‘{Á|Òô‘ü‘{ß{ëzæ1‘ ’9’};‘P|L‘ ’+’{_‘{l‘|„‘€’±’{Ž‘|¥‘€’±’{¯‘}º‘Vz;Ì‘€’ˆ’{Ö‘|ç‘€’…’{ñ‘|ý‘‹’•’{’}’P~&’PÆ=zÏZ€Kzkk­ìU€K­"%ä5‚__a%ä²zjeRÍÜW€KÍkƒøó¶"2 ›"2ø–Ë"2,þ*AMS&‘ïL1¿íUnÂn &‘,‘‘G‘ ‘€KG‘&‘„z‘ «7q6Ó…jr7qz‘…^Î7q‘6Ówk¥‘Å[€Kz€v,Ç‘¡W€KÍ‚__a%ÍÇ‘eRâ‘.Y€Kâ‘`ký‘ïX€K⑆3’SŒ"&AM ›"&ø–Ë"&,‡Qù"'AMws“FŽqäÑ(´’¡“Uxps“Vystr ‘XzÉ’dÀ’Õ’{n|À’Õ’{‰{”{ |·À’È’{Á|ÒÀ’È’{ß{ëzú’1‘Õ’“};‘P|L‘Õ’÷’{_‘{l‘|„‘p“¡“{Ž‘|¥‘p“¡“{¯‘}º‘VzO“Ì‘p“x“{Ö‘|ç‘p“u“{ñ‘|ý‘{“…“{’}’P~&’PÆ=wñ“½­EÑ(¤“ ”Uxprñ“‘|ü“«“ê“}”S}”Rˆ”|/”Ç“Ó“{A”{M”|Z”Ç“Ó“{d”ÐeVÐ*”Ñ€K*”‚__n4Á,‡¡ä4ÂP’ö“‰Z”Ôr*;P’‚__a*;P’‚__b*;P’p”µ˜€Kp”£›;•æV[9]ý#2,V^J•#$¾u”diV\J•…ÍV`Ñ(Ø”¡sÑP•V• \• ð”¾V• \•3•¾VcV•3•¾VhV• J•1hÔVoæbÑ(g• Æ=J•Ñ( Æ=;•u”u”b•u”b•’?CC„•C„•U–öV[9]ý#2,V^d–#$¾•diV\d–…ÍV`Ñ(ò•¡sgAj–p– v– –¾p– v–3–¾Vcp–37–¾Vhp– d–1hÔVo)Ñ(– Ðed–Ñ( ÐeU–••|–•|–;h(l(lž–(lž–2—g'@$pN©–†¦@Èý@2—øª@7—Ø@ +þ —¡sU<—B— H— "—pNB— H— pNB—%þ1þ©–©–N—©–Ü—(@$pNS—†¦@u”@Ü—øª@á—Ø@ V•´—¡s÷æ—ì— ò— Ì—pNì— ò— pNì—P•\•S—S—ø—S—™QÅ@`'k˜big@@bí@c™#C˜¡sü]*™0™ 6™([˜big0™ 6™)big0™:!³@vú˜5‰$& ý—¥˜¡s»¢A™G™ M™ ½˜& G™ M™ И& G™Mé˜`“@odÎ ˜ŠM™`“@p6ÿ: +þ4×@x-éG™ *™: ï? ˜ ˜<™ ˜ý—ý—S™ý—á™IØ@$pNX™†¦@]ý@á™øª@æ™Ø@ ·ý¹™¡s$¦ë™ñ™ ÷™ Ñ™pNñ™ ÷™ pNñ™±ý½ýX™X™ý™X™Ú ª@`:!³@v¹„5‰$& šTbigNš¡s“ÙÚÉš Ïš fš& Éš Ïš yš& ÉšM’š`“@oà¦(šŠM®š`“@p96: ·ý4×@xµ'ÉšššÕššM›—êCE$ÂÚš…ÍCMÑ(8dCNu”%›¡s ‰M›S› Y› =›ÂS› Y› ÂS›ÚšÚš_›Úšæ›?W$•âd›…ÍW/Ñ(8dW0u”+êW1曾›¡s¶›œ¡œ §œ Ö›•â¡œ §œ •â¡œ›œcÖW<9Èý#½ñWõu”#$÷Zæ›…ÍW@Ñ(=œ¡sÔȲœ¸œ ¾œ Uœ÷Z¸œ ¾œ/qœhÔWûÆŸÑ(Éœ3…œ÷ZW⸜J÷ZW踜 \•d›d›­œd›æ›æ›Äœæ›Äœ°‚ M9<þ#½ñMæ›#$lÞÏœjóMÏœ+êMæ›1¡sS[°¶ ¼3JlÞM&¶ \•3clÞM*¶ ¼3}kÞM.¶,/˜{¤M8íì  tdupMK®  ϜϜÂÏœYžá’M~$P Çü¡s ˜Yž_ž ež žP _ž ež 'žP _ž/Gž«×M…šÑ( £ÿ Æ=U½MÃBQþÇÇkžÇìž”X  ²XL\#$?„pžhóX:pž¾ž¡sh~ìžòž øž Öž?„òž øžJ?„XJòž ípžpžþžpžŒŸÏç@$pNŸ†¦@Aü@ŒŸøª@‘ŸØ@ @ýdŸ¡sˆ«–ŸœŸ ¢Ÿ |ŸpNœŸ ¢Ÿ pNœŸQýFýŸŸ¨ŸŸÊ d@`' big@@bí@c™#óŸ¡s¼NÊ Р Ö (  bigР Ö )bigР:!³@vú5‰$& ­ŸU ¡s&Ãá ç  í  m & ç  í  € & ç M™ `“@oµ/¹ŸŠMµ `“@p¿’: @ý4×@x0gç ¹Ÿ¹ŸÜ ¹Ÿ­Ÿ­Ÿó ­Ÿq¡’xX<$Ñlø -¡¡sŸÄq¡w¡ }¡ E¡Ñlw¡ }¡ X¡Ñlw¡4“uX?Z+§1§ 7§ Φ÷Z1§ 7§/ê¦hÔWûÜ•Ñ(B§3þ¦÷ZWâ1§J÷ZWè1§ v–ݥݥ&§Ý¥_¦_¦=§_¦=§)¨ö M9<þ#½ñM_¦#$lÞH§jóMH§+êM_¦ª§¡s/â)¨/¨ 5¨3çlÞM&/¨ v–3ܧlÞM*/¨ 5¨3ö§kÞM./¨,/¨{¤M82x  tdupMKb¶  H§H§;¨H§Ò¨_M~$P @¨u¨¡sjëÒ¨ب Þ¨ ¨P ب Þ¨  ¨P ب/À¨«×M…a/Ñ( £ÿ ÐeU½Më±Qþ@¨@¨ä¨@¨ª®.@`'W©big@@bí@c™#/©¡s0Úª ª ª(G©big ª ª)big ª:!³@všx5‰$& 騑©¡s;Ϊ#ª )ª ©©& #ª )ª ¼©& #ªMÕ©`“@oýõ¨ŠMñ©`“@pdG: @ý4×@x‡i#ªõ¨õ¨ªõ¨é¨é¨/ªé¨­ª¡~X<$Ñl4ªiª¡sXL­ª³ª ¹ª ªÑl³ª ¹ª ”ªÑl³ª4“uX?Cƒ v– øž4ª4ª¿ª4ª,«¾`D5$~ÍĪ†¦D5Ñ(«¡s·\,«2« 8« «~Í2« 8« ~Í2«ĪĪ>«Ī««³µW?$~ÍC«†¦W?Ñ(ƒ«¡s««±« ·« ›«~ͱ« ·« ~ͱ«C«C«½«C«‹÷¯§°!, ”a›UŒˆ!,‘Œ1! ‘ ymm"¼‹‘èyy$b‘˜yŽf¯ÃØ(b‘øwzE­÷¯t•=–}°S{ °zú¬$°’•–{3°{>°|V°’•–{e°{p°|ˆ°§•ó•{’°{°z¿¬´°§•±•{¾°{É°{Õ°{á°zݬ󰱕»•}ý°P{±|±æ•ì•})±P{4±|F±–=–{P±{[±|p±1–=–{z±{…±|œ±1–=–{¦±}±±PzW®÷¯a–1—}°S{ °z ®$°†–—{3°{>°|V°†–—{e°{p°|ˆ°›–ç–{’°{°zÑ­´°›–¥–{¾°{É°{Õ°{á°zï­ó°¥–¯–}ý°P{±|±Ú–à–})±P{4±|F±—1—{P±{[±|p±%—1—{z±{…±|œ±%—1—{¦±}±±P|ñU—˜{ͱ{رz¯ð±U—Þ—{ÿ±{ ²|"²U—Þ—{1²{<²|T²h—´—{^²{i²zÝ®´°h—r—{¾°{É°{Õ°{á°zû®€²r—|—}Š²P{•²|±§—­—})±P{4±|¬²Þ—˜}¶²S{Á²|p±þ—˜{z±{…±|œ±þ—˜{¦±}±±PŽ|¯(ex;ܲz¦¯ç²<šKš{ñ²|³<šKš{³zЯç²KšZš{ñ²|³KšNš{³|ç²ïš ›{ñ²|³ïš›{³°BF€K°…² G©°1Gž?L°ûÙM…€KL°…õ½M…Q°˜?\•~°G«M€K~°…õ½Mƒ°å>\•ª°1€Kª°cQM&¯°¶\•î°Úþ€Kî°QETQþ¢ETQþÝ°ETQþ£ÿ±…œ€K±`QW豸œ\•A± €KA±‚repEŽ£ÿEf±ED€Kf±‚iG/k±x•~’±~€K’±‚__x?¢—±x~¾± ì€K¾±‚__x?kƒë¯ìæ±ën€Kæ±…² G©ë±ÚoGh²ü&M…€K²…õ½M…²Ahv–J²ì M€KJ²…õ½MO²Žgv–v²ª§€Kv²cQM&{²/¨v–¢²þ¦€K¢²`QW觲1§v–̲îl€K̲‚iG/Ѳ’–~ïzá²Ö²³ýþ€Kî°€v,³ÿ€Kî°š³A¾X  ²XLºÿ#$?„³hóX:³l³¡s Kš³ ³ ¦³ „³?„ ³ ¦³J?„XJ ³ K³³¬³³*´’xX<$Ñl±³æ³¡sØ*´0´ 6´ þ³Ñl0´ 6´ ´Ñl0´4“uX?Z¸ \• ¦³±³±³<´±³‘®´ß=XzõÌ›ë›UŒü«Xz®´PŒ`QXz³´‘ ™IX{³žIX}³‘||¸´Õ›Ú›}´P{Í´K¾œÚ´„³€KÚ´ü«XJß´ ³K]µ¡~X<$Ñlä´µ¡sR]µcµ iµ 1µÑlcµ iµ DµÑlcµ4“uX?Ò‘ v– ¦³ä´ä´oµä´‘áµ€Xz(4ì› œUŒü«XzáµPŒ`QXz浑 ™IX{³žIX}³‘||¸´õ›ú›}´P{Í´K7§’¶`ÿd›¤›UŒ–ªXH,‘ŒMXH,‘ O¶}•ÑM8 ‡+`M9¶“{Y¶{d¶q¶®€Kq¶‚repE £ÿ甲¶¶ œ7œU})¶Pˆ5¶|O¶#œ&œ}Y¶P{d¶‘·©[XzŽÂ8œWœUŒü«Xz·PŒ`QXz$·‘ ™IX{pžžIX}pž‘||)·AœFœ}3·P{>·í¾œK·Öž€KK·ü«XJP·òží­·˜•ÑMK ‡’´ML£ÿ“{··{·•ž·{¾°{É°{Õ°{á°“{)±{4±ηJ€Kª°‚clM*η¼”O¸U·XœלU}_·Wˆk·|­·mœ¼œ{··{·z3¸´°mœyœ{¾°}É°S{Õ°{á°|±­œ°œ})±P{4±£¸'ž‚repM…£ÿ‚a_1M…£¸w÷M†Ïœ‡†WM‡¶“{º¸{Ÿ“{æ¸{ñ¸Æ=‰Ò¸bXWTÑ(€KÒ¸S}WT׸ÉœÆ=þ¸•€Kþ¸ŠšVo¹g•Æ=”b¹O¸ØœïœU}Y¸P}e¸‘ ˆ|¸|¨¸Þœçœ{º¸{Ÿ|ܸÞœçœ{æ¸{ñ¸’¹ö§•ÑM8 ‡+`M9/¨“{Y¶{d¶”ιb¹ðœU}l¹Pˆx¹|O¶ }Y¶P{d¶‘;º`vXzŠ ;UŒü«Xz;ºPŒ`QXz@º‘ ™IX{pžžIX}pž‘||)·%*}3·P{>·í7§º¨•ÑMK ‡’´ML£ÿ“{§º{²º•Žº{¾°{É°{Õ°{á°“{)±{4±¾ºç€Kv²‚clM*¾º5¨”?»Eº<»U}OºWˆ[º|ºQ {§º{²ºz#»´°Q^{¾°}É°S{Õ°{á°|±‘”})±P{4±“» ¨‚repM…£ÿ‚a_1M…“»w÷M†H§‡†WM‡/¨“{ª»{µ»“{Ö»{á»Ðe‰»¼™WTÑ(€K»S}WTÇ»B§Ðeî»7–€KšVoó»–Ðe”R¼?»¼ÓU}I»P}U»‘ ˆl»|˜»ÂË{ª»{µ»|Ì»ÂË{Ö»{á»–Ž¼ö•WTÔáU—ü«WŽ¼P—hW“¼‘ ¦³¾œ–Ô¼ˆ§WÊäñU—ü«WÔ¼P—hWÙ¼‘ ¦³7§˜ð¼D, ” ½Þ¼¤›´›U}꼑–I½ògW®'ôžU—ü«WI½P—hWN½‘ øž¾œ–½i W6žžU—ü«W½P—hW”½‘ øž7§‘Ó½ö•Xq#{žžUŒü«XqÓ½‘Œ`QXqؽ‘ ¦³\•‘¾ˆ§Xqsž!žUŒü«Xq¾‘Œ`QXq¾‘ ¦³v–‘[¾ògXqÿï$ž)žUŒü«Xq[¾‘Œ`QXq`¾‘ øž\•‘Ÿ¾i Xq=G,ž1žUŒü«XqŸ¾‘Œ`QXq¤¾‘ øžv–™ËäXH´›Ë›Uš WŽ£š÷¨£›"Fœèzí¾×¾ ¿: ïèoS(¿@´*ò¾œé² TT‹VÐ:ì^YAç^&¿QYM”µó!"")";"M" _"@q"€žƒ"ž–"ž©"ž¼"žÏ"žâ" žõ"@#°#Jž,#?#Q#c#u#‡#™#«#½#Ï# ŸoK N N 'N :N MN `N¡Xÿÿÿÿ V $V EX¡-nÿÿÿÿ $l 5l Vn<‹N‹`‹r‹„‹–‹  Ï‹ó‹Œ ˜Ž ªŽ ¼Ž ÎŽ àŽ òŽ ÇiZ;X @Œ Ê‘ ñ” • • $• 5• F• W• h• y• Š• ›• ¬• ½• Ε ß• ð• – – #– 5– G– Y– ¡– ²–‡— *”¢ÓHŸ¢ÔLŸè    ¢ 'È 9È ]È ÒÊ äÊ Ë }Í Í ³Í î S‘Â(¹£kc\U»Âž{ [G GP 3Y p Ý‚ k˜ š   ž£ ‡¤ W©R% : ; I$ > $ >  : ;  : ; I8 .? ‡@I4 < I4 I .? 4 < .? 4 < I !I/ <  I&I II.I4 < .4 < .4 <  : ; : ;I8 : ;I : ;  : ; II !I : ;  : ; !: ; " : ; #( $I%.4 < &.4 < ' : ; (.? 4 < ).? 4 < *5I+4: ; ‡@I? <  ,4: ; ‡@I? < -.? : ; ‡@< ..? : ; ‡@I< /.? : ; ‡@I< 0.? : ; ‡@I< 1.? : ; ‡@I< 2 : ; I8 2 3.? : ; < 4.? : ; ‡@< 5 : ; I 8 6 : ; I8 7 : ;I8 8&9I8 2 :4: ; ‡@I? < ;.? : ; ‡@2 < <.? : ; 2 < =< >4: ;‡@I? 2 < ?.? : ;‡@I2 < @.? : ;‡@I< A.? : ;‡@< B.? : ;‡@I< C: ;D.? : ;< E.? : ;‡@< FG : ;G.? : ;< HG : ;I : ;IJ.? : ; < K4: ; ‡@I? <  L4: ; ‡@I? 2 < M.? : ; ‡@I2 < N.? : ;‡@2 < O.? : ;‡@I2 < P.? : ;‡@I< Q4: ; ‡@I? <  R4: ; ‡@I? 2 <  S< T< U.? : ; ‡@I< V.? : ; 2 < W.? : ; ‡@2 < X.? : ; ‡@2 < YG : ; Z.? : ;‡@2 < [!\ : ;I8 2 ].? : ;2 < ^.? : ;< _ : ;`.? : ;‡@< a.? : ;‡@I< b4: ; ‡@I? < c4: ;‡@I? < d4: ;‡@I? < e4: ;‡@I? 2 <  f.? : ;2 < g.? : ;‡@I2 < h( i4: ;‡@I? <  j.? : ;‡@I< k4: ;‡@I? < l4: ;‡@I? < m : ;n : ; Io : ;p : ;qr : ; s.? : ; ‡@I2 < t.? : ; ‡@I< u.? : ; < v.? : ; ‡@< w.? : ; ‡@I@ x: ; I y4: ; I z1{1|1}1 ~41 .G €I4 : ; I‚: ; Iƒ.: ; „.? : ;I …: ;I†.: ; I ‡4: ; Iˆ41‰.? : ; I Š‹.? : ; I@ Œ: ; I 4: ; I Ž U4: ; I.? : ; ‘.? : ; ‡@@ ’.4 @ “ ”.1@ • –.? : ;‡@@ —: ;I ˜.4 ™.: ; @ š4: ; I? < › : ; œ4I? 4 < 4G<  ž4G< Ÿ4G 4G< ¡4G<  ¢4G £4: ; ‡@I? 2 < w û /usr/lib/gcc-lib/i386-redhat-linux/3.3.3/include/usr/include/usr/include/bits/usr/include/c++/3.3.3/i386-redhat-linux/bits/usr/include/c++/3.3.3/bits/usr/include/sys/usr/include/c++/3.3.3/usr/include/asm/afs/aei-potsdam.mpg.de/u/peekas/arch/i686/opt/libsigc++-2.0.11/include/sigc++-2.0/sigc++/afs/aei-potsdam.mpg.de/u/peekas/arch/i686/opt/libsigc++-2.0.11/include/sigc++-2.0/sigc++/functors/afs/aei-potsdam.mpg.de/u/peekas/arch/i686/opt/libsigc++-2.0.11/include/sigc++-2.0/sigc++/adaptors/afs/aei-potsdam.mpg.de/u/peekas/arch/i686/opt/libsigc++-2.0.11/include/sigc++-2.0/sigc++/adaptors/lambda../include/modglueuse_wget.ccstddef.hxlocale.htypes.hstdio.hwchar.h_G_config.hgconv.hstdarg.hlibio.htime.hsched.hsigset.hsignal.hpthreadtypes.hpthread.hunistd.hgthr-default.hc++io.hchar_traits.hfpos.hwaitstatus.hstdlib.htypes.htime.hselect.hnewlocale.hnl_types.hiconv.htype_traits.hstl_iterator_base_types.hstl_threads.hatomicity.hstl_alloc.hstringfwd.hbasic_string.hbasic_string.tccstl_bvector.hstl_tree.hlocale_classes.hios_base.hwctype.hctype_base.hcodecvt.hcodecvt_specializations.hlocale_facets.hlimitserrno.hmathdef.hmath.hostreamostream.tccistreamistream.tccbasic_file.htime.hsiginfo.hsigaction.hsigcontext.hsigstack.hucontext.hstl_list.htype_traits.h trackable.h list.tccfunctor_trait.h deduce_result_type.h slot_base.h signal_base.h signal.h connection.h bind.h base.h select.h operator.h slot.h stl_vector.hvector.tccext_process.hh stl_function.hstl_map.hmain.hh iosfwdbasic_ios.hptr_fun.h adaptor_trait.h visit_each.h iostreamc++locale.hstreambufpipe.hh X,žðX$žðXžðXžðWž‡< Wô‡< Wä‡< WÔ‡< M¼„VjcWeV9M9M<Ê);ExMy©^+EãM¿9^ÓEã9/XùPc=Mðœ7rEåqM¢ïMØœ„VjcWeV9M9MXœÊ);ExMy©^"9^EãcM¿9^ÓEã9/X8œùPc=M œ7rEåqM¢ïXì›ùPc=XÌ›ùPc=è‘",·%±7ÅUÍx*³c›wG%íïßc"Îz9WS#êG%¿|Å*áV9*+ß9"Îz9WS#êG%¿|Â~""·%±7ÅUÍx*³c¤wG#%ãáßc"Îz9WS#êG%¿|Å*ýV9*+ß9"Îz9WS#êG%¿|Ì~4¦q*—©4é}·*ú~94‰´Ý~©4©©Ú~·â#ê+–{c#ê9%í|ï#—c%é|9ß9"ÎzcWS#æ%í|:#—c%é|9"­~9WS%Ó"­~WS#ä%í|ï#—c%é|9"­~9WSƒâGþ G#ãw9Mƒ$EÅ|GW”›:Eë~q:#Mƒ)ÿ|cERqGM9?=9G@·%Í·#—c%é|9"­~9WS#æMƒ%EÅ|GW”›:Eë~q:#Mƒ)ÿ|cERqGM9?=9G@·%Í·#—c%é|9"­~9WSMéEÅ|+W”›:Eë~q:#Mƒ)ÿ|cERqGM9?=áGB¸ ÓA%‘›#Á+%¿|U#Á+%¿|#ÁÅ%¿|U#Á+%¿|U#Á+%¿|q#ÁÅ%é|q#“c%í|+ß9"ÎzcWS%©©*#“c%í|+ß9"ÎzcWS%ÓG"­~WS%©G#ÁÅ%¿|+#ÁÅ%é|c#“c%í|+"­~9WSý%“3E“q,UT+%—#"­~WS%©Ý~#Gž(E6G,UT+,(T+L@Gœ* ›X qYh:Xêÿÿÿÿ| ˆ$è‘ÉA…B Fƒ†‡g. N.(´’íA…B Fƒ†‡g. N.l.I.¤“hA…B DƒJ.4 ”UA…B Iƒ†‡Q.Õ.K.I.H.O...Ì›A…B R.ì›A…B R.d›@A…B _. œ+A…B _.8œA…B R. XœA…B Fƒ†‡E.ØœA…B I.ðœ+A…B _.A…B R. <A…B Fƒ†‡E.¼A…B I.Ô A…B E.ä A…B E.¤›A…B H.ô A…B E.ž A…B E.žA…B žA…B $žA…B ,žA…B ´›A…B J.itimerspec_ZNKSt4listIN4sigc9slot_baseESaIS1_EE5beginEvxdigit_S_pback_size_ZNSt10money_base20_S_construct_patternEcccreverse_iterator<__gnu_cxx::__normal_iterator > > >_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue11ext_processEbEEE14is_base_class_Ezsa_sigaction__normal_iterator, std::allocator >*,std::vector, std::allocator >, std::allocator, std::allocator > > > >_ZNSt8ios_base4setfESt13_Ios_Fmtflags_ZNKSs16find_last_not_ofEPKcj_S_showpoint_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE6assignEjRKS2__ZNSt14numeric_limitsIdE13has_quiet_NaNE_S_maximum_ZNKSbIwSt11char_traitsIwESaIwEE5c_strEvadaptor_trait,false>_ZN4sigc12not_equal_toaSERKS0__ZNSsaSEc_ZNKSs12find_last_ofEPKcj_Swap_lock_struct<0>_ZNSt4fposI11__mbstate_tEmiElmake_slot_ZNSt14__simple_allocISt10_List_nodeIN4sigc8internal18trackable_callbackEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS4_output_iterator_tag_ZNSt14numeric_limitsIjE12min_exponentEopipes__ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwjj_ZNSs9_M_mutateEjjj_Rb_tree_color_ZNSt14numeric_limitsIfE15has_denorm_lossEshort unsigned int_ZNKSs4findEPKcj_ZNSt14numeric_limitsItE13has_quiet_NaNEpointer_functor1_M_replace_facet_ZNSt21__numeric_limits_base15has_denorm_lossEmax_exponent10_ZNSt14numeric_limitsIiE9quiet_NaNEv_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE9push_backERKS2__ZNKSs17find_first_not_ofEPKcjnotify_callbacks__simple_alloc >__valuetimeval_ZN11sched_paramaSERKS__ZN4sigc7signal1IbRN7modglue11ext_processENS_3nilEEaSERKS5__G_int16_t_ZNSs6rbeginEvwctrans_t_M_position_STL_mutex_lock_ZNKSt6vectorISsSaISsEE8max_sizeEv_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_12slot_do_bindEEENS_16pointer_functor1IRN7modglue11ext_processEbEEEEvRKT_RKNS_15adaptor_functorIT0_EE_ZN7modglue11ext_process15determine_path_Evptrdiff_t_ZN4sigc8internal23trackable_callback_list15remove_callbackEPv_S_minimum_ZNSspLERKSs_M_replace_category_ZNKSt18_Bit_iterator_baseltERKS___arg_ZNSt8ios_base18_S_local_word_sizeE_ZNSt14numeric_limitsIxE11round_errorEv_S_hex__statep_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE5clearEv__istream_type_ZNSt4fposI11__mbstate_tE5stateES0__List_base >__fsfilcnt_tslot_call1_ZNKSt18_Bit_iterator_baseleERKS__ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE6insertERKS4__ZN7modglue11ext_process7restartEv_ZNSt14numeric_limitsIfE14max_exponent10E_M_open_mode_S_ios_create_M_flags_ZNSt14numeric_limitsItE12min_exponentE_ZNKSs9_M_ibeginEv_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE5beginEvarg1_type__ZN4sigc13greater_equalaSERKS0__ZNSt6localeaSERKS__ZNSt14numeric_limitsIjE15tinyness_beforeE_ZNSt15_STL_mutex_lock15_M_release_lockEv__type_traits_ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEE14is_base_class_Ez_ZNSt14numeric_limitsIsE9is_iec559E_Rb_tree_iterator, std::allocator >, int>,const std::pair, std::allocator >, int>&,const std::pair, std::allocator >, int>*>__blkcnt_t_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE6rbeginEv_ZNSt13_Alloc_traitsIPN7modglue5opipeESaIS2_EEaSERKS4_showmanyc_helper_ZNSt18_Vector_alloc_baseIPN7modglue5opipeESaIS2_ELb1EEaSERKS4__ZNSt14numeric_limitsIsE14max_exponent10E_ZNSt13_Bit_iteratorpLEinothrow_tslot_do_unbindto_int_type_ZNSt14numeric_limitsIiEaSERKS0___gconv_tlambda_action >__m_lock_ZNSt8ios_base4Init14_S_ios_destroyEv__u_intarg2_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue5ipipeEbEEE5valueE_ZNSt14numeric_limitsIcE6digitsEis_base_and_derived >lambda_action >_ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE8max_sizeEv_ZNSt6locale5_Impl14_S_id_messagesElambda_action >lambda_action >_M_fold_ZNKSt8ios_base9precisionEv_ZNSt14numeric_limitsIwE17has_signaling_NaNE_ZN13__type_traitsIaEaSERKS0__ZNSt14numeric_limitsIfE3maxEv_ZNKSbIwSt11char_traitsIwESaIwEE4sizeEvold_sigaction_term_lambda_action >_ZNSaIwE9constructEPwRKw_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE8_S_colorEPSt13_Rb_tree_nodeIS2_Epos_type_ZNSt11__ios_flags10_S_unitbufE_ZNK7modglue11ext_process4argsEv_S_classic_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4__ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwjj_ZNKSt14_List_iteratorIN4sigc9slot_baseERKS1_PS2_EptEvrandom_data_cur_column_ZN4sigc11dereferenceaSERKS0_rand_typeargcremove_Atomic_word_sigfault_ZNSt4listIN4sigc9slot_baseESaIS1_EE8pop_backEv_M_call_callbacksmemory_S_empty_rep_storage_ZNSt12__basic_fileIcE2fdEvsi_fdlconvargv_M_int_bom_ZNSt14numeric_limitsIbE12has_infinityE_ZNSt18_Vector_alloc_baseIPN7modglue5opipeESaIS2_ELb1EE11_M_allocateEj_ZNKSt14_Bit_referenceeqERKS__ZNSt10ctype_base5upperE_ZNSs4rendEv_ZNKSs13find_first_ofEPKcj_M_ok__simple_alloc >__invocation_counter__pid_tvisit_each_type > >_ZNSt19_Bit_const_iteratormmEi_ZNSt18_Vector_alloc_baseIPN7modglue11ext_processESaIS2_ELb1EE13_M_deallocateEPS2_j_ZNKSs4rendEv_S_atoms_in~__basic_file_ZNSt19_Bit_const_iteratormmEv_ZN4sigc13lambda_actionINS_10arithmeticINS_10multipliesEEEEaSERKS4__ZNSt14numeric_limitsIhE12max_exponentE_M_start_ZNSbIwSt11char_traitsIwESaIwEE9push_backEw_M_implrightshiftpair, std::allocator >, int>, std::pair, std::allocator >, int>&, std::pair, std::allocator >, int>*>,bool>_ZNSt14numeric_limitsIiE13signaling_NaNEv_ZNKSs13find_first_ofERKSsj_ZNSt11char_traitsIcEaSERKS0__ZNSt14numeric_limitsIxE9is_iec559E_ZNSt14numeric_limitsIaE8digits10E_ZN13__type_traitsIsEaSERKS0_divides_ZN4sigc19lambda_action_unaryINS_13unary_logicalINS_4not_EEEEaSERKS4__ZNSbIwSt11char_traitsIwESaIwEE4_Rep15_M_set_sharableEv_ZNSt11__ios_flags9_S_badbitE_ZNK4sigc7signal1IbRN7modglue5ipipeENS_3nilEE5slotsEvslot_iterator >_ZNSt14numeric_limitsIeE15has_denorm_lossE__ctype_b_M_free_list_link_ZNSt14numeric_limitsIlE7epsilonEvcntrl_M_decrsys_open_ZNSt24__default_alloc_templateILb1ELi0EE9_S_refillEjtm_min_ZNSt4fposI11__mbstate_tEaSERKS1__List_nodesival_ptr_ZNKSt4listIN4sigc9slot_baseESaIS1_EE5emptyEv_ZNSt14numeric_limitsIlE12has_infinityEsigvec_ZNK4sigc7signal1IbRN7modglue11ext_processENS_3nilEE4emitES3_long long int_ZNKSt13_Bit_iteratormiEi_ZNSt4listIN4sigc9slot_baseESaIS1_EE14_M_fill_assignEjRKS1__M_ext_bom_ZNK4sigc13slot_iteratorINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEeqERKS7_call___Rep_ZNSt14numeric_limitsIbE10is_boundedE_ZNSt4listIN4sigc9slot_baseESaIS1_EE6insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1__ZNK4sigc10connection7blockedEv_ZN4sigc15visit_each_typeIPNS_9trackableENS_8internal12slot_do_bindENS_15adaptor_functorINS_16pointer_functor1IRN7modglue5ipipeEbEEEEEEvRKT0_RKT1_lldiv_t_ZNK4sigc8internal14lambda_select1clEvnumeric_limits_ZNSt14_Bit_referenceaSEbsignal_emit1_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwj_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEE14is_base_class_Ezslot___min_needed_from_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE6rbeginEv_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE2atEj_ZNSt6vectorIPN7modglue5opipeESaIS2_EE6insertEN9__gnu_cxx17__normal_iteratorIPS2_S4_EEjRKS2_ipipectype_basewctype_t_ZNSt11char_traitsIwE12to_char_typeERKj_ZN17_pthread_rwlock_taSERKS_slots_ZNSt4listIN4sigc9slot_baseESaIS1_EE5eraseESt14_List_iteratorIS1_RS1_PS1_ES7__ZN4sigc4and_aSERKS0__ZNK4sigc13slot_iteratorINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEeqERKS7_resize_ZNSt14numeric_limitsIiE13has_quiet_NaNE_ZNSt14numeric_limitsItE9quiet_NaNEv_ZNSaIN4sigc8internal18trackable_callbackEE8allocateEjPKv_ZNSt11char_traitsIwE2eqERKwS2__ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE6rbeginEv_ZNSt14numeric_limitsIwE10is_integerEhas_signaling_NaN__m_reserved_ZNSt14__simple_allocISt10_List_nodeIN4sigc9slot_baseEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS3_j_ZNSaIN4sigc9slot_baseEE10deallocateEPS0_j_flags2_ZN4sigc8internal10count_voidIvvvvvvvE5valueE__flagsref_count_value_compare_timer_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE5eraseESt17_Rb_tree_iteratorIS4_RS4_PS4_E_ZNKSt18_Bit_iterator_baseneERKS_reverse_iterator >_ZNSt14numeric_limitsIlE3minEv_ZN4sigc8internal12signal_emit1IbRN7modglue5ipipeENS_3nilEE4emitEPNS0_11signal_implES4__ZN4sigc13lambda_actionINS_14bitwise_assignINS_9leftshiftEEEEaSERKS4__ZNSt14numeric_limitsIyE13has_quiet_NaNE_ZNSt4listIN4sigc9slot_baseESaIS1_EE5eraseESt14_List_iteratorIS1_RS1_PS1_Eslot >_ZNSaIcE8allocateEjPKv_ZNSt14_List_iteratorIN4sigc9slot_baseERKS1_PS2_EmmEv_ZNSt14numeric_limitsIaE14is_specializedE_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_14slot_do_unbindEEENS_16pointer_functor1IRN7modglue5ipipeEbEEEEvRKT_RKNS_15adaptor_functorIT0_EEhas_trivial_assignment_operator__bits_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EEixEj_M_st_ZN4sigc13lambda_actionINS_10relationalINS_8equal_toEEEEaSERKS4__ZNSt12__enc_traits19_M_get_external_bomEv_ZNSbIwSt11char_traitsIwESaIwEEaSERKS2__unused2_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwjslot_do_bind_ZNSt4listIN4sigc9slot_baseESaIS1_EE4backEv_ZNKSt6vectorISsSaISsEE6rbeginEv_ZNSt14numeric_limitsIiE10is_boundedE_ZN4sigc10connectioncvbEvsigval_t_ZNSt8ios_base4Init13_S_ios_createEbpaused__Alloc_traits,std::allocator >ctype__sighandler_tbasic_istream >_shortbufint_curr_symbolless_equal_ZNSt14numeric_limitsIcE10has_denormE_ZN4sigc9slot_base5blockEb_ZNSs20_S_empty_rep_storageE_ZNSt12__basic_fileIcE8sys_openEP8_IO_FILESt13_Ios_Openmode_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE8_S_valueEPSt13_Rb_tree_nodeIS2_E_ZNSt14numeric_limitsIyE10denorm_minEv__tcf_0_ZNSt14_Refcount_Base7_M_incrEv_ZNKSs7compareEPKcfunc_ptr_si_utime_ZN4waitaSERKS__ZN4sigc13lambda_actionINS_7bitwiseINS_3or_EEEEaSERKS4_sync_with_stdio_ZNSt8ios_base10scientificE_ZNSt14numeric_limitsIeE11round_errorEv_ZNSaIN4sigc8internal18trackable_callbackEE7destroyEPS1_leftshiftsi_pid_S_id_collatelambda_baselower_boundtz_dsttime_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE11_M_transferESt14_List_iteratorIS2_RS2_PS2_ES8_S8___type_traits_ZNKSbIwSt11char_traitsIwESaIwEE3endEvunsetf_ZNSt14_List_iteratorIN4sigc9slot_baseERKS1_PS2_EppEi_ZNSt14numeric_limitsIaE12min_exponentEis_base_and_derived >_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE9_S_parentEPSt13_Rb_tree_nodeIS2_E__ba_required_ZNSt8ios_base5flagsESt13_Ios_Fmtflags_M_cfile_created_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue5ipipeEbEEE14is_base_class_Ez_ZNSt14numeric_limitsIjE6digitsE_M_install_cache__c_lock_ZNSt6vectorISsSaISsEE4swapERS1___normal_iterator, std::allocator > >_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE12destroy_nodeEPSt13_Rb_tree_nodeIS2_E_ZNKSs13find_first_ofEcj__codecvt_ok_ZNSt14numeric_limitsIdE15has_denorm_lossE_ZNK4sigc13slot_iteratorINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEdeEv_ZN4sigc10type_traitIvEaSERKS1___type_traits_ZNSt6locale8messagesE_M_is_leaked_ZN8sigstackaSERKS__ZNSt14numeric_limitsIaE9is_signedE_ZNSt14numeric_limitsIdE14max_exponent10E__type_traitsss_size_ZN4sigc7signal1IbRN7modglue11ext_processENS_3nilEE7connectERKNS_4slotIbS3_S4_S4_S4_S4_S4_S4_EEremove_destroy_notify_callback_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE4rendEv__ba_present_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE11lower_boundERS1__ZNKSt12__basic_fileIcE7is_openEv_ZN4sigc15visit_each_typeIPNS_9trackableENS_8internal12slot_do_bindENS_15adaptor_functorINS_16pointer_functor1IRN7modglue11ext_processEbEEEEEEvRKT0_RKT1__ZNSt8ios_base4Init16_S_ios_base_initE_ZNSt14numeric_limitsIyE10is_boundedE_ZNSs12_M_leak_hardEv_ZNSt8ios_base3octEtm_mon_ZNSt19_Bit_const_iteratorpLEi_ZNSt14numeric_limitsIdE10denorm_minEvregister_callbackless, std::allocator > >_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6insertESt14_List_iteratorIS2_RS2_PS2_EjRKS2__ZNSt6locale5facet11_S_c_localeE_ZNSt11__ios_flags13_S_floatfieldEITIMER_VIRTUALold_sigaction_int_tm_zonemon_grouping__codecvt_do_out_ZNSt14numeric_limitsIjE9quiet_NaNEv_ZN4sigc15adaptor_functorINS_16pointer_functor1IRN7modglue5ipipeEbEEE18deduce_result_typeIS4_vvvvvvEaSERKS8__ZNSt14numeric_limitsIiE7epsilonEv_ZNSt21__numeric_limits_base12has_infinityE_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_modglue_binary__ZNKSt6vectorISsSaISsEE14_M_range_checkEj_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE14_M_range_checkEj_M_bump_up_M_header_ZNSs6appendEPKcnumeric_limits_M_offset_Is_integer_ZNSt14numeric_limitsIhE15tinyness_beforeEnumeric_limitsdataoff_ZNSaIwEaSERKS_is_modulo_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE8_S_rightEPSt13_Rb_tree_nodeIS2_Erend__codecvt_partial_M_get_cacheallocator__schedpolicy_ZNKSs7compareEjjRKSs_ZNK4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE5beginEv_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idEprocess_died_ZNK7modglue11ext_process11input_pipesEv_ZNSt14numeric_limitsIjE11round_styleElambda_action_unary >__m_kind__dataset_parent_ZNSs6insertEjRKSsjj_ZN4sigc8dynamic_aSERKS0___codecvt_do_length_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6insertESt14_List_iteratorIS2_RS2_PS2_ERKS2__ZNSt14numeric_limitsIfE9is_signedE_ZNKSt18_Bit_iterator_basegtERKS__ZNSt6vectorIPN7modglue11ext_processESaIS2_EE6insertEN9__gnu_cxx17__normal_iteratorIPS2_S4_EERKS2__S_categoriesreverse_iterator<__gnu_cxx::__normal_iterator, std::allocator >*, std::vector, std::allocator >, std::allocator, std::allocator > > > > >signal_emit0_ZNSt14numeric_limitsIyE11round_errorEv_ZNKSaIcE8max_sizeEv_ZNSs4_Rep15_M_set_sharableEvlambda_action >_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwjj__csh_ZNK4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE3endEv_ZNSt6locale3allE_ZNSt9time_baseaSERKS_adaptor_trait,false>_pthread_rwlock_t_ZNSt14numeric_limitsIhE10denorm_minEv_ZNK4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE6rbeginEvsig_term_sa_handler_ZNKSt4listIN4sigc9slot_baseESaIS1_EE5frontEv_ZNSt10__num_base12_S_atoms_outE__time_t_ZNSt8ios_baseaSERKS__ZN4sigc8internal11signal_impl7connectERKNS_9slot_baseErand_deg__gconv_init_fct__sigaction_handler_IO_save_end_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refcopyEvbasic_ostream >_ZNKSt6vectorISsSaISsEE4backEv_ZN4sigc16pointer_functor1IRN7modglue11ext_processEbEaSERKS4_rep__ZNSs4_Rep11_S_max_sizeE_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE11equal_rangeERS1__ZNSt14numeric_limitsItE13signaling_NaNEv_ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_j_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE11equal_rangeERS1__ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKwj_ZN4sigc8internal23trackable_callback_list12add_callbackEPvPFS2_S2_E__codecvt_do_encoding_ZNSt14numeric_limitsIcE3maxEvadaptor_basepair, std::allocator >, int>, const std::pair, std::allocator >, int>&, const std::pair, std::allocator >, int>*>,std::_Rb_tree_iterator, std::allocator >, int>, const std::pair, std::allocator >, int>&, const std::pair, std::allocator >, int>*> >_ZNSt14numeric_limitsIiE14min_exponent10Echar_traits_ZNSt12__basic_fileIcE5closeEv_ZNSt10money_baseaSERKS_fpregset_t_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2__ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_leakedEv_ZNSt6vectorISsSaISsEE5beginEv_ZNSt21__numeric_limits_base10is_integerE_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_14slot_do_unbindEEENS_16pointer_functor1IRN7modglue11ext_processEbEEEEvRKT_RKT0__ZNSt6locale5_Impl13_S_id_collateE__schedparam_ZNSt14numeric_limitsIxE14min_exponent10E_ZNSt14numeric_limitsIcE15has_denorm_lossE_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE4rendEv_ZNSt14numeric_limitsIjE10has_denormE_ZN7modglue11ext_process11open_pipes_Ev_ZNSt13_Bit_iteratorixEi_RC_t_M_width_ZNSt14numeric_limitsIxE9quiet_NaNEv_ZNSt8ios_base15sync_with_stdioEb_ZNSt14numeric_limitsIcE12has_infinityEkey_type__gconv_btowc_fct__off_ttype_limited_actionint_p_sep_by_space_ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEE19avoid_gcc3_warning_Ev_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEE3bigaSERKS8_slot1_ZNSt8ios_base6badbitEinput_pipe_libc_fpreg__type_traits_ZN4sigc8internal11signal_impl9referenceEv_ZNSt14numeric_limitsIlE10denorm_minEv_ZNSt8ios_base8showbaseEnot_eofthis_ZNSt14numeric_limitsItE3minEv_ZNSt14numeric_limitsIeE8infinityEv_ZNSt14numeric_limitsIiE12max_exponentE__steps_ZNSt11char_traitsIwEaSERKS0__ZNSt4listIN4sigc9slot_baseESaIS1_EE9push_backERKS1__ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_14slot_do_unbindEE9with_typeILb0ENS_16pointer_functor1IRN7modglue11ext_processEbEEEaSERKSC_basic_ios >_S_showpos_ZNSbIwSt11char_traitsIwESaIwEE7reserveEj_ZNSt13_Alloc_traitsIPN7modglue11ext_processESaIS2_EE15_S_instancelessE__status_ZNSt14numeric_limitsIbE9is_moduloE_ZNSt6vectorIPN7modglue5opipeESaIS2_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS2_S4_EERKS2__IO_wide_data_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE14_M_fill_insertESt14_List_iteratorIS2_RS2_PS2_EjRKS2__IO_markerfpos_M_refcopy_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue5ipipeEbEEE3bigaSERKS8_lambda_action >_M_local_word_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwPKwS5__ZNKSt4lessISsEclERKSsS2_char_traits_ZNKSbIwSt11char_traitsIwESaIwEE6lengthEv__trans_end_fct_IO_statereverse_iterator, std::allocator >, int>, const std::pair, std::allocator >, int>&, const std::pair, std::allocator >, int>*> >_A_functor_ZNSt14numeric_limitsIlE14is_specializedE_ZNSt11char_traitsIcE3eofEv_ZNKSs12find_last_ofEPKcjj_ZNSt8iteratorISt26random_access_iterator_tagbiPbRbEaSERKS3__ZNSt14numeric_limitsImE12has_infinityEprintcallbacks_~signal1binary_function, std::allocator >,std::basic_string, std::allocator >,bool>_ZNSt13_Alloc_traitsIPN7modglue5ipipeESaIS2_EE15_S_instancelessEtype_traitalnum~list_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE10push_frontERKS6_sigcontext_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE4swapERS6__ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_12slot_do_bindEEENS_16pointer_functor1IRN7modglue5ipipeEbEEEEvRKT_RKNS_15adaptor_functorIT0_EE_ZNSt8ios_base5fixedE_ZN7modglue4main3addEPNS_5opipeEi_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE11upper_boundERS1___uint64_t_ZNSt21__numeric_limits_base8is_exactEprocesses__ZNSt14numeric_limitsIyE14is_specializedE_ZNSt18_Vector_alloc_baseIPN7modglue11ext_processESaIS2_ELb1EE11_M_allocateEj_ZNSt14numeric_limitsIcE11round_styleE_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE3endEv__cd_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEjc_ZNSt14numeric_limitsIfE7epsilonEv_ZNSt10ctype_baseaSERKS_reverse_iterator<__gnu_cxx::__normal_iterator > > >_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6assignEjRKS2_typed_rep_ZNSt8ios_base4Init20_S_synced_with_stdioE_Is_integer_ZNSt6vectorIPN7modglue5opipeESaIS2_EEaSERKS4_int_frac_digits_ZNK4sigc9slot_base10set_parentEPvPFS1_S1_E_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcj_S_uppercase_ZNKSt19_Bit_const_iteratormiEi_ZN4sigc13lambda_actionINS_7bitwiseINS_4and_EEEEaSERKS4___sched_param_ZNKSs4_Rep12_M_is_sharedEv_ZNSt14numeric_limitsIjE8infinityEv__inheritsched_ZNKSt6localeeqERKS__ZNSt6vectorIPN7modglue5opipeESaIS2_EEixEj_ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE4sizeEv_ZN6sigvecaSERKS__ZNSt14numeric_limitsIiE3minEvsival_int_ZNKSs12find_last_ofERKSsj_ZN4sigc8internal11signal_impl16unreference_execEv_ZN4sigc15adaptor_functorINS_16pointer_functor1IRN7modglue11ext_processEbEEEaSERKS6_lambda_action >to_char_type_ZNSt14numeric_limitsIbE14min_exponent10E_ZNSt8ios_base9precisionEibasic_string,std::allocator >emit_ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue5ipipeEbEEEaSERKS7_visit_each_type > >~ext_process_ZNKSt14_Bit_referencecvbEv_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE5eraseESt17_Rb_tree_iteratorIS2_RS2_PS2_ESC__ZNSt6locale4timeE_ZNKSt8ios_base9_M_getlocEv_S_left_ZNSt14numeric_limitsIbE14max_exponent10E_ZNSt14numeric_limitsIlE8digits10E_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE5frontEv_M_ios_seekdir_end_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_disposeERKS1__ZNSt14numeric_limitsIwE12has_infinityE_M_pword_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEE3bigaSERKS8__ZNSt4lessISsEaSERKS0_quot_ZNSt22_Rb_tree_base_iterator12_M_incrementEv__w_termsig__m_count_ZNSt14numeric_limitsIwE7epsilonEv_ZSt4cerrround_to_nearest_ZNSaIwE8allocateEjPKvdeduce_result_type,modglue::ipipe&,void,void,void,void,void,void,false>_ZN4sigc10connection7unblockEv_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEaSERKS7__ZNSt14numeric_limitsIyE15has_denorm_lossE_Alloc_traits, std::allocator >,std::allocator, std::allocator > > >_ZNSt16_List_alloc_baseIN4sigc9slot_baseESaIS1_ELb1EE11_M_put_nodeEPSt10_List_nodeIS1_E_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_terminalE_ZNSt6vectorIPN7modglue5opipeESaIS2_EE6insertEN9__gnu_cxx17__normal_iteratorIPS2_S4_EERKS2__ZN4sigc13slot_iteratorINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEaSERKS7__ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE8capacityEv_ZNSs6assignERKSsjj_ZNSt14numeric_limitsIbE15has_denorm_lossE_ZNK4sigc8internal14lambda_select7clEv_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE4rendEv__pthread_cond_align_tfull_path__S_basefield_ZNSt8ios_base5pwordEi_ZNSt14numeric_limitsItE14min_exponent10E__sig_atomic_t_ZNSt14numeric_limitsIxE9is_signedE__alignsi_overrun_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE7_M_rootEv_ZNSt14numeric_limitsItE10denorm_minEvoperator-=end_ptr__codecvt_noconv_ZNSaIN4sigc8internal18trackable_callbackEEaSERKS2__ZNSt14numeric_limitsIfE11round_errorEv_M_clonevector >~temp_slot_list_ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEE14is_base_class_EPS1__ZNSt8ios_base6unsetfESt13_Ios_Fmtflags_ZNSt14numeric_limitsIcE13has_quiet_NaNE_ZNK4sigc13slot_iteratorINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEneERKS7___sched_prioritymoney_base_ZNSt14numeric_limitsIbE12min_exponentE_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE10push_frontERKS6__S_atoms_out_ZNSt14numeric_limitsIsE11round_errorEv_ZNSt8ios_base3appE_ZNK4sigc9trackable27add_destroy_notify_callbackEPvPFS1_S1_E_ZNSt14numeric_limitsIaE8is_exactE_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue5ipipeEbEEE19avoid_gcc3_warning_Ev_ZN11_Is_integerIyEaSERKS0__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE12insert_equalESt17_Rb_tree_iteratorIS2_RS2_PS2_ERKS2___streambuf_typeexec_count__ZNSt14numeric_limitsIsE13has_quiet_NaNE_ZN8timespecaSERKS__A_target_ZNKSbIwSt11char_traitsIwESaIwEE7_M_dataEv_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE6insertEN9__gnu_cxx17__normal_iteratorIPS2_S4_EERKS2__ZNSt21__numeric_limits_base5trapsE_Alloc_type_ZNSt14numeric_limitsIlEaSERKS0__ZNSt14numeric_limitsIeE13signaling_NaNEv_ZNSt14numeric_limitsIfE15tinyness_beforeE__c_locale_S_empty_rep_M_iword_sigev_un_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE4sizeEv_ZNSt14numeric_limitsIfE6digitsE_ZNSt11char_traitsIcE7compareEPKcS2_jslot_const_iterator >_ZNSt6vectorISsSaISsEEaSERKS1__ZNKSbIwSt11char_traitsIwESaIwEE6substrEjjfind_first_of_ZNSt11__ios_flags8_S_rightE_ZNSt11char_traitsIcE4moveEPcPKcj_ZNSt8ios_base3decE_ZN13__type_traitsIdEaSERKS0_ss_sp_ZNSt24__default_alloc_templateILb1ELi0EE22_S_node_allocator_lockE_ZNK4sigc9slot_base27add_destroy_notify_callbackEPvPFS1_S1_Emax_exponent_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE5eraseEPS1_S9__ZN4sigc13lambda_actionINS_14bitwise_assignINS_3or_EEEEaSERKS4_with_typelambda_action >_ZNSt10ctype_base5alnumE_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE6resizeEj_Alloc_traits, std::allocator >, int> >,std::allocator, std::allocator >, int> > >__suseconds_t_ZNKSaIN4sigc9slot_baseEE8max_sizeEv_M_ref_count_lock_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE5beginEv_ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv_ZNKSs7compareEjjPKc_ZNSt14numeric_limitsIeE10has_denormE__FILE_ZNSs4swapERSs_ZNSt14numeric_limitsIaE10has_denormE_ZNSt14numeric_limitsIlE12min_exponentE_ZN4sigc13pre_incrementaSERKS0_substr_Alloc_ZN4sigc10connectionaSERKS0__S_instancelesssignature_M_insert_aux_ZN4sigc11signal_baseaSERKS0__ZN4sigc13slot_iteratorINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEmmEi_ZN4sigc8internal11signal_impl5clearEv__fsblkcnt64_tvector >_ZNK4sigc11signal_base5emptyEv~_Alloc_hider_ZN4sigc8internal12slot_do_bindaSERKS1__ZNSt14numeric_limitsIxE5radixE_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hideraSERKS3__ZNSt14numeric_limitsItE8infinityEv_ZN8_fpstateaSERKS__ZNSt19_Bit_const_iteratorixEi_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwj_ZNKSt18_Bit_iterator_basegeERKS__ZNSt14_List_iteratorIN4sigc9slot_baseERS1_PS1_EppEi__pos__in_ZNSt14numeric_limitsIxE6digitsE_M_decrementlambda_action_unary >operator&_ZNSt14_List_iteratorIN4sigc9slot_baseERS1_PS1_EppEvoperator*operator+_S_keyoperator-_ZNKSt6vectorISsSaISsEEixEj_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE5beginEv_ZNSsaSERKSs__eshoperator<operator=operator>_ZNK4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE5beginEvsignal_emit0basic_string,std::allocator >_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE4rendEv_S_refilllambda_action >_Rb_tree_base_iterator_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKwj_ZNSt6vectorIPN7modglue5opipeESaIS2_EE6resizeEjRKS2__ZNKSt6vectorIPN7modglue5opipeESaIS2_EE8capacityEv_ZNSt14numeric_limitsIcE7epsilonEv_M_key_compare_ZNSt13_Alloc_traitsISt13_Rb_tree_nodeISt4pairIKSsiEESaIS3_EEaSERKS6_sigevent__false_type_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2_jjvisit_each_type > >__socklen_t_ZNSt24__default_alloc_templateILb1ELi0EE14_S_chunk_allocEjRi_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE6_S_keyEPSt13_Rb_tree_nodeIS2_E_M_word_M_refdata__cd_out_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE13_M_clone_nodeEPSt13_Rb_tree_nodeIS2_E__int64_tdenorm_present__m_owner_ZNSt14numeric_limitsIaE15has_denorm_lossE_ZNSt14numeric_limitsIlE10has_denormE_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue11ext_processEbEEE5valueE__locale_tregister_t_IO_write_ptr_ZNSt14numeric_limitsIjE17has_signaling_NaNEcount_void_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw_ZNSt14numeric_limitsIwE10is_boundedE_ZNSt8ios_base3outE__fsblkcnt_t_ZNSt11__new_allocaSERKS__ZNSt14numeric_limitsIiE8digits10E_ZNKSaIN4sigc9slot_baseEE7addressERKS0__M_acquire_lock_ZNSt8ios_base3hexE_ZNSs6assignERKSs_ZNSt21__numeric_limits_base14max_exponent10E_ZNSt4listIN4sigc9slot_baseESaIS1_EE6insertESt14_List_iteratorIS1_RS1_PS1_ERKS1__ZTISt9exception_ZNSt14numeric_limitsIjE14is_specializedE_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_12slot_do_bindEEENS_16pointer_functor1IRN7modglue5ipipeEbEEEEvRKT_RKT0__ZNSt14_Refcount_BaseaSERKS__ZNSt6vectorIPN7modglue11ext_processESaIS2_EE6resizeEjRKS2__ZNSt14numeric_limitsItE7epsilonEv_ZNSt14numeric_limitsIyE8infinityEv_ZN8timezoneaSERKS__ZNSbIwSt11char_traitsIwESaIwEE4swapERS2___clockid_t_M_out_desc_fileno_ZNK4sigc7signal1IbRN7modglue5ipipeENS_3nilEE9make_slotEv_Alloc_traits, std::allocator >, int>,std::allocator, std::allocator >, int> > >lambda_action >_ZNSbIwSt11char_traitsIwESaIwEE5eraseEjj_pthread_fastlockradix__from_name_ZNK4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE5frontEvfds_bitswith_type >unreference_execreverse_iterator<__gnu_cxx::__normal_iterator, std::allocator > > >lambda_action >destroy___ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_j_ZNSt13_Bit_iteratormIEi_ZNSt14numeric_limitsIaE9quiet_NaNEv_ZNKSbIwSt11char_traitsIwESaIwEE9_M_ibeginEv_ZNSt6locale8monetaryEblocked_ZNSt10money_base7patternaSERKS0__ZNKSt6vectorISsSaISsEE8capacityEv_ZNSt11__ios_flags8_S_fixedE_ZNSt4listIN4sigc9slot_baseESaIS1_EE3endEv_ZNSt14numeric_limitsIaEaSERKS0__ZN4sigc4slotIbRN7modglue11ext_processENS_3nilES4_S4_S4_S4_S4_EaSERKS5_slot_iteratorpunct_ZN8ucontextaSERKS__ZNKSt14_List_iteratorIN4sigc9slot_baseERKS1_PS2_EdeEv_ZNSs4_Rep7_M_grabERKSaIcES2__ZNSt6vectorIPN7modglue11ext_processESaIS2_EE6assignEjRKS2__ZNSt8iteratorISt19output_iterator_tagvvvvEaSERKS1__ZN4sigc9slot_base7unblockEv_ZNSt21__numeric_limits_baseaSERKS__ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE4backEv_ZNSt8ios_base9uppercaseE_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE4backEv_ZNSt14numeric_limitsIsE11round_styleE_ZNSt14numeric_limitsIjE12max_exponentE_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE4sizeEv_ZNSt24__default_alloc_templateILb1ELi0EE13_S_start_freeE_ZNSt21__numeric_limits_base6digitsE_G_int32_t~localelimit_derived_target_ZNSt4listIN4sigc9slot_baseESaIS1_EE6uniqueEv_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwj_ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEE5valueE_ZNSt18_Rb_tree_node_base10_S_minimumEPS__ZNSt14numeric_limitsIxE10has_denormE_ZNK4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE4rendEv_ZNSt14numeric_limitsIyE5trapsE_G_iconv_t_ZN4sigc8internal23trackable_callback_listaSERKS1__S_facet_categories__rlim64_t_ZN4sigc7dividesaSERKS0__ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEEpthread_once_t_ZNSt14numeric_limitsIhE13has_quiet_NaNE_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2___gconv_info_ZNKSaIN4sigc8internal18trackable_callbackEE7addressERS1__ZNSt6vectorIPN7modglue5ipipeESaIS2_EE3endEv_ZNSt14numeric_limitsImE14max_exponent10E_ZNSt13_Alloc_traitsISt13_Rb_tree_nodeISt4pairIKSsiEESaIS3_EE15_S_instancelessE_ZNSs4nposE_ZNSt4fposI11__mbstate_tEpLEl~allocator_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwj_ZNSt14numeric_limitsItE5radixE_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE14_M_fill_assignEjRKS2_lambda_action >tm_yday_ZNSt14numeric_limitsIsEaSERKS0__ZN4sigc13functor_traitINS_16pointer_functor1IRN7modglue5ipipeEbEELb1EEaSERKS6_type_trait_ZNKSt4fposI11__mbstate_tEcvlEv_ZNSt14numeric_limitsIxE13has_quiet_NaNE_ZNSt6locale24_S_extra_categories_sizeEminus_ZNSt14numeric_limitsImE6digitsE_ZNSt21__numeric_limits_base12min_exponentE_M_set_leaked_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKw~signal_base_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE11_M_leftmostEv_ZNKSs5rfindEcj_pthread_descr_ZNKSs8max_sizeEv__codecvt_destr_sifields_ZN17__gconv_step_dataaSERKS___w_stopvalimbue_event_ZN7modglue11ext_process22determine_binary_type_Ev_ZN4sigc8internal8slot_rep6notifyEPv__type_traits_ZNSt14numeric_limitsIlE10is_integerE_ZN4sigc5minusaSERKS0__ZNSt14numeric_limitsIhE10has_denormE_ZN4sigc8internal14temp_slot_list5beginEv__exchange_and_add_ZNSs7replaceEjjjc_ZNSt14numeric_limitsIwE15has_denorm_lossE_ZNSt14numeric_limitsIhE8is_exactE_ZNSt14numeric_limitsIfE3minEv_ZNSs7replaceEjjPKcj_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE10_S_minimumEPSt13_Rb_tree_nodeIS2_Ereverse_iterator<__gnu_cxx::__normal_iterator > > >_ZNSt14numeric_limitsIwE11round_styleE_ZNSs6insertEjRKSs_ZNSt14numeric_limitsImE9is_signedE_M_pipoff_M_t_ZNSt6vectorIPN7modglue5ipipeESaIS2_EEixEj_M_word_size_ZN4sigc13lambda_actionINS_14bitwise_assignINS_4and_EEEEaSERKS4__ZNKSbIwSt11char_traitsIwESaIwEE8max_sizeEvslot_list >_Is_integerimbue_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPS2_S4_EEjRKS2__S_apphas_infinity__fsfilcnt64_tnpos_S_scientific_M_precision__ioinit_ZNSt6locale5_Impl19_M_remove_referenceEvrbegin_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE5emptyEv_ZN4sigc11lambda_baseaSERKS0_is_exact_S_showbase_ZNSt14numeric_limitsIcE13signaling_NaNEv_ZNSt6locale5_ImplaSERKS0__ZNSt14numeric_limitsIwE5trapsE_M_ibegin_ZNSt14numeric_limitsIxE12has_infinityEreverse_iterator<__gnu_cxx::__normal_iterator > > >numeric_limits__type_traits_ZNSt14numeric_limitsIsE3maxEv_ZNSt6locale5_Impl11_S_id_ctypeE_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE13get_allocatorEv_S_inslot_call1,bool,modglue::ipipe&>find_first_not_of_ZNSt14numeric_limitsIdE9is_moduloEsi_tid~connection__ctype_tolowercleanup__ZNSt14numeric_limitsIyE8is_exactE_ZN4sigc9slot_baseaSERKS0__ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE5eraseESt14_List_iteratorIS2_RS2_PS2_ES8_cookie_write_function_t_ZNKSt4listIN4sigc9slot_baseESaIS1_EE4backEv_S_highwaterblocked__M_grow_wordsuc_mcontext_ZNSt6vectorISsSaISsEE7reserveEj_M_set_sharablelambda_action >_ZNSt14numeric_limitsIeE14min_exponent10E_ZNSt10ctype_base5lowerE_ZN11_Is_integerIiEaSERKS0__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE8_S_valueEPSt18_Rb_tree_node_base_ZNSt14numeric_limitsIdE15tinyness_beforeEvisit_each, sigc::pointer_functor1 >_ZN4sigc19lambda_action_unaryINS_16unary_arithmeticINS_13pre_decrementEEEEaSERKS4_numeric_limits_ZNSt14numeric_limitsIfE8digits10E_ZNSt8ios_base9boolalphaE_ZNSt10ctype_base5punctE_ZNSt8ios_base7showposE__normal_iterator > >epsilon_ZN11_Is_integerIcEaSERKS0_negateconst_iterator_type_ZNSt6vectorISsSaISsEE5eraseEN9__gnu_cxx17__normal_iteratorIPSsS1_EE_Ios_Iostate_ZNKSs2atEj_ZNSt14_Bit_reference4flipEvuc_sigmaskpid__ZNSt4listIN4sigc9slot_baseESaIS1_EE4swapERS3__ZNKSt6vectorISsSaISsEE13get_allocatorEv_S_ios_base_init_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEE5valueE_ZN4sigc11signal_base6insertESt14_List_iteratorINS_9slot_baseERS2_PS2_ERKS2_error_t__localesoperator()_Is_integer_ZN7modglue11ext_process11setup_pipesEv_M_dispose_callbacks_ZNSs7reserveEj_ZNSt14numeric_limitsIcE12min_exponentE_Rb_tree_node_ZNSs5clearEv_A_a1_ZNSs13_S_copy_charsEPcS_S__ZN4sigc13lambda_actionINS_5otherINS_6assignEEEEaSERKS4__ZNSt8ios_base3ateE_ZNSt21__numeric_limits_base10is_boundedEnumeric_limits_ZNSs4_RepaSERKS__Integralallocator_S_right__stateful_ZNSt14__simple_allocISt10_List_nodeIN4sigc9slot_baseEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS3_sa_flags_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE_ZNKSbIwSt11char_traitsIwESaIwEE4findEwj_ZNSs5beginEv_ZNSt13_Bit_iteratoraSERKS__ZNSt14numeric_limitsIlE9quiet_NaNEv_ZNSt14numeric_limitsImE17has_signaling_NaNE_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE6rbeginEv_ZNSt11char_traitsIcE6assignERcRKclambda_action_unary >_ZNK4sigc10connection9connectedEv_ZNSt24__default_alloc_templateILb1ELi0EE12_S_force_newE__u_char_M_grab_chainsig_call_typereverse_iterator > >_ZNSt14numeric_limitsIhE3maxEv__io_close_fnuc_stackpush_back_ZNSt6vectorIPN7modglue5opipeESaIS2_EE4backEv_S_ate~_List_basereverse_iterator > >_ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE3endEv_ZNSs7replaceEjjPKc_S_format_intdebugout_ZNSt6locale2id12_S_highwaterE_ZNK4sigc11signal_base4sizeEv_ZNSt14numeric_limitsIlE11round_styleElambda_action_unary >_ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw_ZNSt11__ios_flags12_S_basefieldE_ZNSt14numeric_limitsIhEaSERKS0__ZNSt14_List_iteratorIN4sigc9slot_baseERKS1_PS2_EaSERKS5__ZNSt6locale5_Impl13_S_id_numericE_ZNKSbIwSt11char_traitsIwESaIwEE4rendEv_ZNSt11__ios_flags7_S_leftE_ZN7_fpxregaSERKS__ZNSt24__default_alloc_templateILb1ELi0EE8allocateEjadd_callbacktm_hour_ZNSt14numeric_limitsIbE6digitsE_ZNKSbIwSt11char_traitsIwESaIwEE5beginEv_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE4sizeEv_ZNSt14numeric_limitsIhE14is_specializedEoperator bool_M_get_external_encterminate_main_loop__ZN4sigc8internal10count_voidIvvvvvvvEaSERKS2__ZNSt14numeric_limitsIdE9is_signedE_ZNSt10__num_baseaSERKS__ZNSt14numeric_limitsImE12min_exponentE_ZNSs4_Rep11_S_terminalE_ZNSt14__simple_allocISt10_List_nodeIN4sigc9slot_baseEESt24__default_alloc_templateILb1ELi0EEE8allocateEj_ZNSbIwSt11char_traitsIwESaIwEE4_RepixEj_ZNSt14numeric_limitsIeE7epsilonEv_ZNSt14numeric_limitsIeE17has_signaling_NaNE_M_destroy_ZN4sigc12functor_baseaSERKS0__ZNK7modglue11ext_process6outputEvoutput_pipes__ZNSt14__simple_allocISt10_List_nodeIN4sigc9slot_baseEESt24__default_alloc_templateILb1ELi0EEE8allocateEv_ZNK7modglue11ext_process4nameEv_ZN4sigc8internal12signal_emit1IbRN7modglue11ext_processENS_3nilEEaSERKS6__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE9_M_insertEPSt18_Rb_tree_node_baseSA_RKS2_c_str__gsh_ZN4sigc10type_traitINS_12functor_baseEEaSERKS2__ZNSt14numeric_limitsIwE14is_specializedEis_POD_type_ZNSt14_List_iteratorIN4sigc9slot_baseERKS1_PS2_EmmEi_ZNSt14numeric_limitsIyE3minEv_ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEE14is_base_class_Ez_ZNSt6vectorIPN7modglue5opipeESaIS2_EE6resizeEjtime_basevisit_each, sigc::pointer_functor1 >_M_allocatesweep_ZN4sigc19lambda_action_unaryINS_16unary_arithmeticINS_13pre_incrementEEEEaSERKS4__ZNSt11char_traitsIwE6assignERwRKw_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE9pop_frontEv__combined_IO_save_base__gnuc_va_listhas_denorm_ZNSt14numeric_limitsIsE10is_integerE_ZNSt14numeric_limitsIsE5trapsE_ZNSo6sentrycvbEv._11_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE11lower_boundERS1__ZNSt14numeric_limitsItE6digitsEis_base_and_derived >__sigset_t_ZNKSs6lengthEv_ZN7modglue4main5checkEv__initialize_p_ZNSt14numeric_limitsIeE8is_exactElambda_action >take_Ios_Seekdirgetline, std::allocator >slot1 >_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE6rbeginEv_ZNSt6vectorIPN7modglue11ext_processESaIS2_EEixEj_ZN4sigc8internal11signal_impl11unreferenceEv_ZNSt8ios_base5iwordEi_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE6rbeginEv_S_round_up__ssize_t_IO_buf_end_ZNSt21__numeric_limits_base9is_moduloEnumeric_limits_ZNSt14numeric_limitsIwE12min_exponentE_ZN11_Is_integerIlEaSERKS0__ZNSt11char_traitsIwE6lengthEPKw_ZNK4sigc8internal14lambda_select6clEv_ZNSt14numeric_limitsIcE15tinyness_beforeE_SVID__M_refcount_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6removeERKS2__ZN11_IO_codecvtaSERKS___old_x_Words_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE5frontEv_ZNSt14numeric_limitsIiE9is_signedE_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EEixEj_ZNSt14numeric_limitsIaE12max_exponentE_Bit_const_iterator_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE4swapERS4_lambda_select1lambda_select2lambda_select3lambda_select4lambda_select5lambda_select6lambda_select7_ZNSt18_Rb_tree_node_base10_S_maximumEPS__ZNSt6vectorIPN7modglue11ext_processESaIS2_EE4rendEv_ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2__S_synced_with_stdio_ZNSt14numeric_limitsIcE10is_integerE_List_node_base__codecvt_do_unshift__simple_alloc >~main_ZNSt14numeric_limitsIaE10denorm_minEv_M_parentdup___Swap_lock_struct_ZNSt14numeric_limitsIcE8infinityEv_ZNK7modglue11ext_process12output_pipesEv_ZNSt8ios_base10floatfieldEflip_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwj_ZNSt14numeric_limitsIbE9quiet_NaNEv_ZNSt14numeric_limitsIxE14max_exponent10Eaction___compar_fn_t_ZN4sigc8internal8slot_repaSERKS1__ZNSt8ios_base14_Callback_list16_M_add_referenceEvallocator, std::allocator > >_M_black_ZNKSs7compareEjjRKSsjj__dso_handlesort_ZNSt4listIN4sigc9slot_baseESaIS1_EE5beginEv_ZNSt14numeric_limitsIfE17has_signaling_NaNE_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EES6__ZNSt14numeric_limitsIhE10is_integerE_ZN4sigc13slot_iteratorINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEppEi_ZNSt14numeric_limitsIcE8digits10E_M_get_out_descriptor_ZNSaIcEaSERKS__S_default_pattern_ZNSt14__simple_allocISt10_List_nodeIN4sigc8internal18trackable_callbackEESt24__default_alloc_templateILb1ELi0EEE10deallocateEPS4_j_ZNSt14numeric_limitsIeE12has_infinityE_ZN4sigc13slot_iteratorINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEppEv_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEwpthread_mutexattr_t_ZNSt18_Bit_iterator_base12_M_bump_downEv_ZN4sigc13adaptor_traitINS_16pointer_functor1IRN7modglue5ipipeEbEELb0EEaSERKS6__ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue11ext_processEbEEE3dupEPv_Rb_tree_base, std::allocator >, int>,std::allocator, std::allocator >, int> > >replace_M_insert_ZNSt14numeric_limitsIbE5trapsE_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE11lower_boundERS3__ZN11_Is_integerIjEaSERKS0___new_alloc_ZNSt14numeric_limitsIaE13signaling_NaNEv_ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_12slot_do_bindEE9with_typeILb0ENS_16pointer_functor1IRN7modglue5ipipeEbEEE8execute_ERKSB_RKS5___io_seek_fn_ZNSt14numeric_limitsIlE5radixE__codecvt_do_max_length_ZNKSs3endEv_ZN23_pthread_cleanup_bufferaSERKS_timezone_ZNSt14numeric_limitsIxE11round_styleE_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE3endEv_ZN4sigc13lambda_actionINS_10arithmeticINS_7dividesEEEEaSERKS4__ZNSt8ios_base7failbitE_ZNKSs17find_first_not_ofEPKcjj_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE8_S_rightEPSt18_Rb_tree_node_base_ZNSt14numeric_limitsIwE9quiet_NaNEv__codecvt_do_in_IO_write_endoperator!=_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryaSERKS3__ZNSt6vectorIPN7modglue11ext_processESaIS2_EEaSERKS4__ZNSt6vectorIPN7modglue5ipipeESaIS2_EE4rendEv_ZNSt6vectorISsSaISsEEixEj_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE5eraseENS_13slot_iteratorIS6_EES9__ZN7modglue11ext_process4forkEv_ZNSt14numeric_limitsIeE10denorm_minEv_ZNSt11char_traitsIwE3eofEv_ZNSt6vectorIPN7modglue5opipeESaIS2_EE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPS2_S4_EEjRKS2__ZNSt24__default_alloc_templateILb1ELi0EE5_LockaSERKS1__ZNSt14numeric_limitsIjE12has_infinityE_ZNKSbIwSt11char_traitsIwESaIwEE13get_allocatorEv_S_failbit__rw_pshared_M_in_desc__gid_t_ZNSt11char_traitsIwE4moveEPwPKwj_ZNSt14numeric_limitsIcE14min_exponent10Esi_sigvalerase_event_ZNSt6vectorIPN7modglue5opipeESaIS2_EE5eraseEN9__gnu_cxx17__normal_iteratorIPS2_S4_EE_ZNSs6appendERKSsjj_ZNSt14numeric_limitsIhE13signaling_NaNEv__w_coredump__end_fct_ZN4sigc7modulusaSERKS0__ZNSt14numeric_limitsIeE9is_iec559E__trans__uint8_t_ZNSt14numeric_limitsIeE9is_moduloEbinary_ZNSt18_Vector_alloc_baseIPN7modglue5ipipeESaIS2_ELb1EEaSERKS4__M_increment_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE9push_backERKS6_slot_list >_ZNSt14numeric_limitsIcE3minEvoldmask_ZNSs3endEv_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE5eraseENS_13slot_iteratorIS6_EES9_sig_t__gthread_key_t_ZNSt12__basic_fileIcE12_M_open_modeESt13_Ios_OpenmodeRiS2_Pc_ZNSt14numeric_limitsIeE15tinyness_beforeE_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_jj_M_rightmost_ZNSt14numeric_limitsIeE10is_boundedE_ZNSt18_Vector_alloc_baseIPN7modglue11ext_processESaIS2_ELb1EEaSERKS4__ZNKSs17find_first_not_ofERKSsj_G_uint16_t_ZNSt8ios_base2inE_ZNSt14numeric_limitsIiE6digitsE_ZNK7modglue4main12fds_to_watchERSt6vectorIiSaIiEExsgetnw_status_ZN7modglue7pipebuf6bufsizE_ZNSt14numeric_limitsIyE15tinyness_beforeE_ZNSt14numeric_limitsIiE9is_moduloE_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue5ipipeEbEEEaSERKS7__ZNSaIN4sigc9slot_baseEE8allocateEjPKvfind_last_of_ZNSt14numeric_limitsIbE15tinyness_beforeE_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_RKS2__ZNSt19_List_iterator_base7_M_incrEv_ZNSbIwSt11char_traitsIwESaIwEEpLEPKw__gthread_once_t_M_red_ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_14slot_do_unbindEE9with_typeILb0ENS_16pointer_functor1IRN7modglue5ipipeEbEEEaSERKSC__ZNSt14numeric_limitsIjE5radixEsa_restorer_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE6_S_keyEPSt18_Rb_tree_node_base_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE14_M_range_checkEj_M_repbound_const_mem_functor1,modglue::ipipe&>has_trivial_destructor_ZNSt14numeric_limitsIsE9is_signedEsi_stimeempty_ZNSt14numeric_limitsIbE13has_quiet_NaNE_S_create_ZNSt14numeric_limitsIyE12has_infinityE_ZNSt8ios_base3curE_S_eofbit_ZNSt6vectorISsSaISsEE6assignEjRKSsreserve_ZNK4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE4rendEvlambda_action >_ZNSt14numeric_limitsIbE8is_exactE_ZNK4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE4backEv_ZN7timevalaSERKS__S_unitbuf_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE3endEv_ZN4sigc13lambda_actionINS_10relationalINS_4lessEEEEaSERKS4_~_Impl_ZN4sigc15adaptor_functorINS_16pointer_functor1IRN7modglue5ipipeEbEEEaSERKS6__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE11upper_boundERS1_static_reverse_iterator<__gnu_cxx::__normal_iterator, std::allocator > > >_ZNKSbIwSt11char_traitsIwESaIwEEixEj_ZNSt19_Bit_const_iteratoraSERKS___normal_iterator > >_ZNSt14numeric_limitsIjE9is_iec559E_ZNSt6vectorISsSaISsEE5frontEv_ZNSt14numeric_limitsIjE9is_moduloEclose_parentside__ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE4rendEvnumeric_limits__locale_struct__val_ZNSt19_Rb_tree_alloc_baseISt4pairIKSsiESaIS2_ELb1EE11_M_get_nodeEv_ZNSt11__ios_flags10_S_showposEhas_trivial_default_constructor_ZNSt14numeric_limitsIhE9is_iec559E_ZNSbIwSt11char_traitsIwESaIwEE4rendEv_ZNSt11__ios_flags14_S_adjustfieldE_Obj~sentry__max_needed_from_ZNKSt6vectorISsSaISsEE4sizeEv_ZNSt6locale5_Impl10_S_id_timeE_ZNSt14numeric_limitsIsE14is_specializedE_ZNSt14numeric_limitsImE5trapsE_ZNSt4listIN4sigc9slot_baseESaIS1_EE10push_frontERKS1__ZNSt14numeric_limitsIhE11round_errorEv_ZNSt14numeric_limitsIjE10is_integerE_ZNSt14numeric_limitsIfE10has_denormE_ZNSt14numeric_limitsIiE15tinyness_beforeE_ZNSt8ios_base6_WordsaSERKS0_const_reference_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue11ext_processEbEEEaSERKS7_streamsizesig_chld_operator<=_ZNSt14numeric_limitsImE9quiet_NaNEv_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSstv_usec_ZNSt14numeric_limitsIdE12min_exponentEtv_nsec_ZNSt12__enc_traits7_M_goodEvdetermine_path_adaptor_functor >close_ZNSt14numeric_limitsItE15has_denorm_lossE_ZNSt14numeric_limitsIhE5radixE_POSIX__ZNSt6vectorIPN7modglue11ext_processESaIS2_EE4backEvreallocate_ZNSt14numeric_limitsIeE3maxEv_ZNSt14numeric_limitsImE10denorm_minEv_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE11upper_boundERS3_push_frontparent__ZNSs5eraseEjjis_signedgraphset_slot_ZNSt18_Bit_iterator_base7_M_incrEi__blksize_t_ZNSt14numeric_limitsIcE17has_signaling_NaNE_Bit_type_ZN4sigc8internal14lambda_select7aSERKS1__ZN4sigc13pre_decrementaSERKS0__ZNSs7_M_dataEPc_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE_ZNSt12codecvt_baseaSERKS__ZN4sigc10type_traitIRN7modglue5ipipeEEaSERKS4__ZNSt14numeric_limitsIwE8digits10E_ZNK7modglue11ext_process9exit_codeEv_ZNSt18_Bit_iterator_baseaSERKS__Is_integerother_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE4rendEv_ZNSt14numeric_limitsIxE17has_signaling_NaNE_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_jc_M_facets_ZNSt14numeric_limitsIiE14max_exponent10E_ZNSt11__ios_flags9_S_eofbitE_ZN7modglue11ext_process24setup_pipes_from_string_ERKSs_ZNK4sigc10connection5emptyEvpause__gconv_loaded_objectoperator()_ZNSt6locale5_Impl16_M_add_referenceEv_ZNKSt19_List_iterator_baseeqERKS__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc_ZNSo6sentryaSERKS__ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEE14is_base_class_EPS1__ZNSt14numeric_limitsIdEaSERKS0__ZNKSt6vectorISsSaISsEE2atEj_ZNSt14numeric_limitsIxE15tinyness_beforeE_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE8key_compEv__simple_alloc_ZNSs12_S_constructEjcRKSaIcE_ZNSt6locale5ctypeE_ZNSt12__enc_traits19_M_get_internal_bomEv__dummy_ZNSt14numeric_limitsIaE15tinyness_beforeE_ZNSbIwSt11char_traitsIwESaIwEE6resizeEjavoid_gcc3_warning__ZNSt11__new_alloc8allocateEj__u_short_ZN4sigc8internal14slot_do_unbindaSERKS1__Alloc_traits >call_it__internal_use_M_mask_ZNSt14numeric_limitsIdE11round_styleE_M_rightconst_pointer_ZN4sigc8internal8slot_rep7destroyEv_Is_integer_ZNSt11__ios_flags8_S_truncE_S_id_monetary_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwS8_wget1_ZN4sigc13lambda_actionINS_10arithmeticINS_5minusEEEEaSERKS4__ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE5clearEv_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE3endEv_ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEEaSERKS7__ZNSt12__enc_traits7_M_initEvlambda_action >_ZNSt13_Alloc_traitsISt10_List_nodeIN4sigc8internal18trackable_callbackEESaIS3_EEaSERKS6___to_type_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEE19avoid_gcc3_warning_Evlambda_action >~_List_node_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE9push_backERKS2_~_Rb_tree_baserand_sep__key_t_ZNSs6appendEPKcjsigev_signo_ZNSt14numeric_limitsIlE10is_boundedE_ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_jsiginfo_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6spliceESt14_List_iteratorIS2_RS2_PS2_ERS4__ZN4sigc8internal14lambda_select5aSERKS1__ZNSbIwSt11char_traitsIwESaIwEE12_S_empty_repEv_ZNSt10money_base18_S_default_patternE_ZNSt14_List_iteratorIN4sigc9slot_baseERS1_PS1_EmmEi_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE5emptyEv_ZNSt11char_traitsIwE11eq_int_typeERKjS2__ZN13_IO_wide_dataaSERKS__ZNSt6vectorISsSaISsEE6resizeEj_ZNSt6vectorISsSaISsEE6resizeEjRKSs_ZNSt14_List_iteratorIN4sigc9slot_baseERS1_PS1_EmmEv__loff_t~typed_slot_rep_ZNSt14numeric_limitsItE9is_iec559E_ZN4sigc12adaptor_baseaSERKS0__ZNSt14numeric_limitsItE9is_moduloE_ZNSaIwE7destroyEPw_ZNSt14numeric_limitsIxE15has_denorm_lossE_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEE5valueE_ZNKSs12find_last_ofEcj_ZNSt14_Refcount_Base7_M_decrEv_Vector_alloc_base,true>_ZNSt14numeric_limitsIhE17has_signaling_NaNE__wait_terminated_ZNSt14numeric_limitsIlE13signaling_NaNEv_Nodeadd_fds_si_signo_old_offset_ZNSt14numeric_limitsIcE9quiet_NaNEvtrapno_ZNSt14numeric_limitsIbE12max_exponentElong long unsigned int__fpregs_memss_onstack_List_iteratoroperator++_ZNSt14numeric_limitsIaE14min_exponent10E_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE5beginEv_ZNSt24__default_alloc_templateILb1ELi0EEaSERKS0__ZN4sigc7addressaSERKS0__ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue11ext_processEbEEEaSERKS7_no_orderadaptor_trait_ZNSt14numeric_limitsIiE5trapsE_ZN4sigc13slot_iteratorINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEmmEvoperator+=_ZNSt14numeric_limitsIlE15has_denorm_lossE_ZNSt13_Alloc_traitsIN4sigc8internal18trackable_callbackESaIS2_EE15_S_instancelessE_ZNSt14numeric_limitsIyE13signaling_NaNEvdenorm_absent_ZNSt14numeric_limitsIhE11round_styleE_M_facets_size_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwj_ZNSt14numeric_limitsIsE15has_denorm_lossE~_Vector_base_Z12receive_infoRN7modglue5ipipeE_ZNSbIwSt11char_traitsIwESaIwEE6assignEjw~trackable_ZN7modglue4main3addEPNS_5ipipeEibasic_ofstream >_ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE4rendEv_ZNSt12__enc_traits19_M_get_external_encEv_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE5countERS1__ZN11_Is_integerItEaSERKS0__ZNSbIwSt11char_traitsIwESaIwEEaSEPKwsi_status_ZNSt14numeric_limitsIdE5radixE_ZNSt12__basic_fileIcEaSERKS0__ZNKSs13find_first_ofEPKcjjrptr_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE9pop_frontEv_ZNKSt18_Vector_alloc_baseIPN7modglue5ipipeESaIS2_ELb1EE13get_allocatorEv_ZNKSs5beginEv_ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEjRKS1__ZNSt14numeric_limitsIfE12has_infinityE__modname__trans_context_fct_ZNSt14numeric_limitsIwE13has_quiet_NaNE_ZNSt6vectorIPN7modglue5opipeESaIS2_EE5beginEv_ZNSt4listIN4sigc9slot_baseESaIS1_EE5clearEv__basic_file_ZNSt14numeric_limitsIxE3maxEvstack_t_ZNSt14numeric_limitsImE10has_denormE__exceptionuint_ZN4sigc8internal14lambda_select3aSERKS1__ZNKSt8ios_base5flagsEv_ZNSt13_Alloc_traitsIN4sigc9slot_baseESaIS1_EEaSERKS3__M_get_in_descriptor_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEE19avoid_gcc3_warning_Ev_ZNSt16_List_alloc_baseIN4sigc8internal18trackable_callbackESaIS2_ELb1EE11_M_put_nodeEPSt10_List_nodeIS2_E_S_max_size_ZNSt14numeric_limitsIhE12min_exponentE__c_waiting_ZNSt14numeric_limitsIlE12max_exponentE_ZNSt14numeric_limitsIyE9is_iec559Efunctor_trait,true>_ZNSt14numeric_limitsIyE9is_moduloEoperator--wait_ZNSt21__numeric_limits_base17has_signaling_NaNE_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwjj_ZN4sigc8internal10slot_call1INS_16pointer_functor1IRN7modglue11ext_processEbEEbS5_EaSERKS7__M_get_internal_bom_M_capacity__intptr_toperator->_ZN2tmaSERKS_get_pid__normal_iterator > >fds_to_watch_ZNSt14numeric_limitsIbE17has_signaling_NaNE_ZN7modglue11ext_process15receive_output_ERNS_5ipipeE_ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue5ipipeEbEEE7destroyEPv_ZNSt22_Rb_tree_base_iterator12_M_decrementEvwchar_t_ZNSt14numeric_limitsIwE15tinyness_beforeE_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE5frontEv__normal_iterator > >pthread_spinlock_ttinyness_beforehook__paddingargc__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EEaSERKS8__ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE3endEv_ZNSt14numeric_limitsIhE7epsilonEv_ZNSt14numeric_limitsIdE14is_specializedE__desc_type_ZNSt11__ios_flagsaSERKS__ZNSt14numeric_limitsItE8is_exactE_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwj_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_14slot_do_unbindEEENS_16pointer_functor1IRN7modglue5ipipeEbEEEEvRKT_RKT0__ZNK4sigc8internal14lambda_select2clEv_ZNSt21__numeric_limits_base9is_iec559Esigstack_ZNSt14numeric_limitsIaE10is_integerEsignal1_ZNK4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE3endEv__mode_titimervalsplicenumeric_limits_padfunctor_pipe_fds__ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_jwlambda_action >_ZNSt4listIN4sigc9slot_baseESaIS1_EE5frontEvdisconnect_ZNSt14numeric_limitsIbE5radixEdatasel_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE9pop_frontEv_ZNSbIwSt11char_traitsIwESaIwEE2atEj_ZN4sigc10less_equalaSERKS0__IEEE__ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE10push_frontERKS2_signal_emit1_ZNSt4fposI11__mbstate_tEmIEltype_trait >char_traits_ZNK4sigc7signal1IbRN7modglue5ipipeENS_3nilEEclES3__ZN4sigc13lambda_actionINS_7logicalINS_3or_EEEEaSERKS4__ZNSt14numeric_limitsIsE9is_moduloE_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE6rbeginEv_ZN4sigc8internal14lambda_select1aSERKS1__ZNSt14numeric_limitsImE3maxEv_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE4findERS1__ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE4rendEv_ZNSt14numeric_limitsIyE7epsilonEv_ZNSt14numeric_limitsIeEaSERKS0_double_ttyped_slot_rep >get_allocator_ZNKSt18_Vector_alloc_baseIPN7modglue11ext_processESaIS2_ELb1EE13get_allocatorEv_ZNSt11char_traitsIwE11to_int_typeERKw_ZNSs4_RepixEjcssel_ZNK4sigc8internal14lambda_select5clEv_ZNKSs4findEPKcjj_S_chunk_allocwrite_M_get_internal_enc_ZNKSs7_M_iendEv_ZNK4sigc11signal_base4implEvtyped_slot__itimer_which_ZNSt21__numeric_limits_base8digits10E_ZNSt14numeric_limitsIeE6digitsE_G_fpos_tlambda_action_unary_ZNKSt14_Bit_referenceltERKS__S_categories_size_ZN7modglue11ext_process16close_childside_Ev_ZNK4sigc9slot_basecvbEvmergelambda_action >_ZNSbIwSt11char_traitsIwESaIwEE5clearEv__nlink_t_LIB_VERSION_TYPE_ZNSt8ios_base6xallocEv_ZNSt14numeric_limitsIsE10is_boundedE_ZNSt14numeric_limitsIhE8infinityEv__resultround_toward_neg_infinity__ino64_treverse_iterator<__gnu_cxx::__normal_iterator, std::allocator >*, std::vector, std::allocator >, std::allocator, std::allocator > > > > >_ZN4sigc6negateaSERKS0__ZNSt13_Alloc_traitsIPN7modglue5opipeESaIS2_EE15_S_instancelessEfirst_argument_type_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEEixERS3__ZNSt14numeric_limitsIeE5trapsE_ZNSt12__basic_fileIcE6xsgetnEPci_sigchld_ZNKSt6locale2id5_M_idEv_ZNSt16_List_alloc_baseIN4sigc8internal18trackable_callbackESaIS2_ELb1EE11_M_get_nodeEvlambda_action_unary >_Refcount_Base_ZNSt4listIN4sigc9slot_baseESaIS1_EE9pop_frontEvit_interval__next~slot_rep_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE5beginEv__int_type_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_sharedEv_ZNSt8ios_base6binaryE_ZNKSs4findERKSsj_ZNSt6vectorIPN7modglue5opipeESaIS2_EE4swapERS4___cpu_mask_ZN4sigc8internal8slot_rep10set_parentEPvPFS2_S2_E_IO_read_endself_type_ZNSaIcE9constructEPcRKc_ZNSt14numeric_limitsItE14max_exponent10Elambda_action >slot_ZNKSs17find_first_not_ofEcjesp_at_signal_ZNSt14numeric_limitsIwE6digitsE_ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKw__type_traits_ZN4sigc7static_aSERKS0__ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEE14is_base_class_EPS1__ZNKSs13get_allocatorEv_ZN4sigc13lambda_actionINS_10relationalINS_13greater_equalEEEEaSERKS4___normal_iterator, std::allocator > >_ZNSt14numeric_limitsIiE11round_errorEv_ZNSt14numeric_limitsIyE3maxEv_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE5beginEvu_int16_t_Base_ptr_ZNSt14numeric_limitsIcE10is_boundedE_M_word_zero_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE5emptyEv_Alloc_traits,std::allocator >pointer_functor1_ZNSt6vectorISsSaISsEE4backEv_ZNSt18_Vector_alloc_baseISsSaISsELb1EE11_M_allocateEjkey_comp_ZN12drand48_dataaSERKS__ZNSt6locale11_M_coalesceERKS_S1_j_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE14_M_create_nodeERKS2__ZNSt14numeric_limitsIeE12min_exponentE_ZNSt11__ios_flags10_S_failbitE_ZNSt14__simple_allocISt10_List_nodeIN4sigc9slot_baseEESt24__default_alloc_templateILb1ELi0EEEaSERKS6_opipesecond_argument_type__mutexkind_List_iterator_base_ZN4sigc4not_aSERKS0__ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS3_S3_traps_IO_last_state_ZN11_Is_integerIxEaSERKS0__ZNK4sigc8internal14temp_slot_list3endEv_ZNKSbIwSt11char_traitsIwESaIwEE8capacityEv_ZNKSs5emptyEv_ZNSt14numeric_limitsIbE9is_signedE_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentrycvbEv_ZNSt8ios_base14_Callback_list19_M_remove_referenceEv_ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_12slot_do_bindEE9with_typeILb0ENS_16pointer_functor1IRN7modglue11ext_processEbEEEaSERKSC__ZN11random_dataaSERKS__ZNSt14numeric_limitsItE11round_styleE_ZNSt11char_traitsIcE7not_eofERKi_ZN4sigc13lambda_actionINS_17arithmetic_assignINS_7dividesEEEEaSERKS4__ZNSt21__numeric_limits_base12max_exponentE_Rb_tree, std::allocator >,std::pair, std::allocator >, int>,std::_Select1st, std::allocator >, int> >,std::less, std::allocator > >,std::allocator, std::allocator >, int> > >_ZNSt14numeric_limitsIxE10is_integerE_ZN4sigc13lambda_actionINS_7bitwiseINS_9leftshiftEEEEaSERKS4__ZNSs4_Rep8_M_cloneERKSaIcEj_ZNSt14numeric_limitsItE10has_denormEreverse_iterator > >_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE5beginEv_ZNK7modglue11ext_process7get_pidEv_ZNSt14numeric_limitsIlE13has_quiet_NaNE_ZNSt14numeric_limitsImE8is_exactE_ZN4sigc15visit_each_typeIPNS_9trackableENS_8internal14slot_do_unbindENS_15adaptor_functorINS_16pointer_functor1IRN7modglue11ext_processEbEEEEEEvRKT0_RKT1_is_base_and_derived_ZNSt10ctype_base5graphE_ZNSt14numeric_limitsIcE5trapsE__ios_flags_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE8max_sizeEvsys_ungetc_ZNSt14numeric_limitsIjE13signaling_NaNEv_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE4sizeEvunsigned char__stacksize_IO_FILE__counter_ZNSt15basic_streambufIwSt11char_traitsIwEE13_S_pback_sizeEit_value_ZNSt11__ios_flags6_S_outE_ZNSt14numeric_limitsIsE3minEv_ZNSt6vectorISsSaISsEE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPSsS1_EEjRKSs_ZN4sigc10connection8set_slotEPNS_9slot_baseEvisit_each, sigc::pointer_functor1 >min_exponent_ZNSt14numeric_limitsIfE5trapsE_S_construct_ZNSt8ios_base4InitaSERKS0__ZNKSt14_List_iteratorIN4sigc9slot_baseERS1_PS1_EdeEv_ZNSt14numeric_limitsIwE13signaling_NaNEvtrackable_callback~_Lock_ZNK4sigc13slot_iteratorINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEptEv_ZNSt14numeric_limitsIcE8is_exactE_ZNSt24__default_alloc_templateILb1ELi0EE12_S_heap_sizeE_ZN4sigc13lambda_actionINS_17arithmetic_assignINS_10multipliesEEEEaSERKS4_numeric_limits_ZNSt8ios_base5imbueERKSt6locale_ZNSt14numeric_limitsIlE14min_exponent10Eexit_code__ZN11_Is_integerImEaSERKS0__ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2__ZNSt14numeric_limitsIdE10has_denormE_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6rbeginEvgregstm_year_ZNK4sigc5slot1IbRN7modglue11ext_processEEclES3__ZNSbIwSt11char_traitsIwESaIwEE7_M_dataEPw_ZNSbIwSt11char_traitsIwESaIwEEpLEwfunc_destroy_notifysigevent_trestart_M_release_lockmapped_type_ZNSt17_Swap_lock_structILi0EEaSERKS0__ZNSt6vectorIPN7modglue11ext_processESaIS2_EE2atEj_M_index__dattype_trait >_ZNSt14numeric_limitsIyE14min_exponent10Euc_flagsreceive_output___fd_mask_ZNKSt8ios_base5widthEvallocator, std::allocator >, int> >_ZN4sigc8internal11signal_execaSERKS1_allocator >part_ZNSaIwE10deallocateEPwj_Alloc_traits >_ZNSt11char_traitsIcE2ltERKcS2__ZNK4sigc16pointer_functor1IRN7modglue11ext_processEbEclES3__ZNSt14numeric_limitsIaE8infinityEv_ZN4sigc9leftshiftaSERKS0__G_fpos64_t_ZNSt11char_traitsIcE4copyEPcPKcj__rw_writer_ZNSt14_List_iteratorIN4sigc9slot_baseERS1_PS1_EaSERKS4_pthread_cond_t_ZNSt14numeric_limitsIdE9quiet_NaNEv_ZNSt14numeric_limitsIaE5trapsE_ZNSt11char_traitsIwE7compareEPKwS2_jslot_iterator >_ZN4sigc4xor_aSERKS0__ZNSt13_Alloc_traitsIN4sigc9slot_baseESaIS1_EE15_S_instancelessE_XOPEN__ZN4sigc13lambda_actionINS_10relationalINS_12not_equal_toEEEEaSERKS4__ZNK7modglue11ext_process11output_pipeERKSslist >_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE8max_sizeEv_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE5eraseEN9__gnu_cxx17__normal_iteratorIPS2_S4_EES8___routine_ZN4sigc16pointer_functor1IRN7modglue5ipipeEbEaSERKS4___gconv_trans_datapass__lockkind_ZNSt14numeric_limitsIhE3minEv_ZNSt24__default_alloc_templateILb1ELi0EE10deallocateEPvj_ZNSt14numeric_limitsIcE12max_exponentE_ZNSt14numeric_limitsIbE14is_specializedErebind__wait_stoppedpop_backsi_band__init_fctmessages_base_Vector_base, std::allocator >,std::allocator, std::allocator > > >_ZNSt14numeric_limitsIlE6digitsE_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE12_M_rightmostEv_ZNKSt4listIN4sigc9slot_baseESaIS1_EE3endEv_ZNSs9push_backEcgoodbit__pshared_ZN13__type_traitsIjEaSERKS0__ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1__ZNSt11char_traitsIcE12to_char_typeERKi_Rb_tree_iterator, std::allocator >, int>,std::pair, std::allocator >, int>&,std::pair, std::allocator >, int>*>seekpos_ZNKSaIwE7addressERKwcookie_seek_function_t_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6resizeEjRKS2__ZNKSt4listIN4sigc9slot_baseESaIS1_EE4sizeEv_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE5eraseENS_13slot_iteratorIS6_EEdenorm_min_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE14_M_fill_insertEN9__gnu_cxx17__normal_iteratorIPS2_S4_EEjRKS2___fsid_t_ZN7modglue11ext_process9terminateEiGNU C++ 3.3.3 20040412 (Red Hat Linux 3.3.3-7)_ZN4sigc18deduce_result_typeINS_16pointer_functor1IRN7modglue5ipipeEbEES4_vvvvvvLb0EEaSERKS6__S_id_messages._15_ZNKSt16_List_alloc_baseIN4sigc8internal18trackable_callbackESaIS2_ELb1EE13get_allocatorEv_ZN4sigc5slot1IbRN7modglue5ipipeEEaSERKS4__ZNSs6assignEPKcjsize_type_ZNSt14numeric_limitsIyE9quiet_NaNEv_ZNSt4listIN4sigc9slot_baseESaIS1_EE14_M_fill_insertESt14_List_iteratorIS1_RS1_PS1_EjRKS1_pthread_barrier_t_ZNKSt19_Bit_const_iteratordeEv_ZNSt4listIN4sigc9slot_baseESaIS1_EE6assignEjRKS1___w_retcode_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE13get_allocatorEv_M_erase_ZNSt13_Rb_tree_baseISt4pairIKSsiESaIS2_EEaSERKS4__ZNSt14numeric_limitsIfE8infinityEv_ZNSt12_Vector_baseIPN7modglue11ext_processESaIS2_EEaSERKS4__ZNSt14numeric_limitsIjE10is_boundedE_ZN4sigc5slot1IbRN7modglue11ext_processEEaSERKS4__ZNSt14numeric_limitsImE12max_exponentE__min_needed_to_ZNKSbIwSt11char_traitsIwESaIwEE6_M_repEv__simple_alloc,std::__default_alloc_template >_M_names__io_write_fn_ZNSt14numeric_limitsIcE9is_iec559E_ZN12__gconv_stepaSERKS__ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc__numeric_limits_base_ZNKSs5c_strEv_ZNSs13_S_copy_charsEPcPKcS1__ZNSt10__num_base15_S_format_floatERKSt8ios_basePcci_M_incrcodecvt_base_M_create_node_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE4backEvlong double_ZN4sigc13slot_iteratorINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEmmEi_ZNSt14__simple_allocISt10_List_nodeIN4sigc8internal18trackable_callbackEESt24__default_alloc_templateILb1ELi0EEE8allocateEv__type_traits_ZNKSt6vectorISsSaISsEE3endEv_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE4swapERS8__S_c_locale_ZN4sigc13slot_iteratorINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEmmEv_ZNKSs4dataEv_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS2_S4_EERKS2_fpregsnl_item_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE6insertENS_13slot_iteratorIS6_EERKS6__ZNSt8ios_base5widthEi_ZNSt14numeric_limitsIeE14max_exponent10Eis_iec559_ZNSt12_Vector_baseISsSaISsEEaSERKS1__ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE5frontEvlambda_actioncatalog_ZN4sigc13slot_iteratorINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEaSERKS7_type_trait_M_coalesce_ZNSt14numeric_limitsIjE8is_exactE_ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEE19avoid_gcc3_warning_Ev_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE2atEj_ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_j_ZNSt14numeric_limitsIaE13has_quiet_NaNE_ZNSt8ios_base14_Callback_listaSERKS0_input_iterator_tag_ZNSt9nothrow_taSERKS__ZN11_Is_integerIbEaSERKS0_xsputn_ZNSt14numeric_limitsIyE12min_exponentE_S_global_ZN4sigc10type_traitIRN7modglue11ext_processEEaSERKS4__ZN4sigc8internal11signal_impl5eraseESt14_List_iteratorINS_9slot_baseERS3_PS3_E_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi_ZNSt15_STL_mutex_lock15_M_acquire_lockEv_IO_read_ptr_markers_ZN13__sched_paramaSERKS__ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE13get_allocatorEv_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6uniqueEv__gconv_trans_end_fct_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6spliceESt14_List_iteratorIS2_RS2_PS2_ERS4_S8_S8__ZNSt22_Rb_tree_base_iteratoraSERKS__ZNSt14numeric_limitsIwE12max_exponentE_ZNSt14numeric_limitsIjE3maxEv__outbufendcurrency_symbol_ZNSt11__ios_flags9_S_skipwsEdetermine_binary_type__ZNSt6vectorIPN7modglue5opipeESaIS2_EE5frontEv__in_chrgsetup_pipes_ZNSt14numeric_limitsIbE7epsilonEv_ZNSt10_List_baseIN4sigc8internal18trackable_callbackESaIS2_EEaSERKS4___gconv_trans_fct_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE4sortEv_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE8pop_backEv_ZNSt12_Vector_baseIPN7modglue5ipipeESaIS2_EEaSERKS4__S_color__trans_fct_ZNSt11__ios_flags5_S_inE_ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2_jj~slot1_ZNSt14numeric_limitsIhE15has_denorm_lossEelement_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE7reverseEv_ZN10_IO_markeraSERKS__ZNSs6assignEPKcoperator<<_ZN4sigc8internal11signal_impl5sweepEv_ZNSt14numeric_limitsIhE9is_moduloE_ZNSt6vectorIPN7modglue5opipeESaIS2_EE9push_backERKS2__ZN4sigc8internal10slot_call1INS_16pointer_functor1IRN7modglue11ext_processEbEEbS5_E7call_itEPNS0_8slot_repES5_input_pipessubscript_ZNKSt18_Bit_iterator_baseeqERKS__ZNKSbIwSt11char_traitsIwESaIwEE2atEjallocator, std::allocator >, int> > >const_reverse_iterator_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EEaSERKS4_slot_type_ZNSs6resizeEj_ZNSt8ios_base6eofbitE_ZNSt14numeric_limitsIwE9is_iec559E/afs/aei-potsdam.mpg.de/u/peekas/projects/modglue/examples_ZN11__exceptionaSERKS__ZNK4sigc13slot_iteratorINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEneERKS7__ZNSt14numeric_limitsIhE8digits10Eslot_list_typenegative_sign_ZNSs6insertEjjc_ZNSs6assignEjc_ZNKSs4copyEPcjj_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwjsigev_notifylist >_ZNSt14numeric_limitsIaE6digitsEoperator==swap_List_alloc_base_ZN4sigc8equal_toaSERKS0__Raw_bytes_alloc_ZNSt14numeric_limitsIsE7epsilonEv_ZNSt14numeric_limitsIfE5radixEoutput_piperfind_ZN4sigc13lambda_actionINS_17arithmetic_assignINS_5minusEEEEaSERKS4__ZN8_IO_FILEaSERKS__ZNSt10_List_baseIN4sigc9slot_baseESaIS1_EEaSERKS3__ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEE5valueE_ZNSt14numeric_limitsItE15tinyness_beforeEallocator >_fxsr_env_ZNSt24__default_alloc_templateILb1ELi0EE11_S_round_upEj_Self_ZN10itimerspecaSERKS__ZN7siginfoaSERKS_args_has_trivial_copy_constructor__c_file_ZNK4sigc9slot_base30remove_destroy_notify_callbackEPv_ZNSt10_List_baseIN4sigc9slot_baseESaIS1_EE7__clearEvlast_readoperator>=_ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEE14is_base_class_EPS1_cpu_set_t_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentrycvbEv_ZNSt21__numeric_limits_base14is_specializedE_ZNSt14numeric_limitsIjE14min_exponent10E_ZNSs6appendERKSs_ZNSt14numeric_limitsIjE11round_errorEv_ZNSt14numeric_limitsIxE13signaling_NaNEv_ZNSt14numeric_limitsIyE8digits10Epthread_key_t__default_alloc_template__uid_t_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE5eraseESt14_List_iteratorIS2_RS2_PS2_E_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE5emptyEv_ZNSt14numeric_limitsIyEaSERKS0__ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwj__detachstate_ZNSt14numeric_limitsImE9is_iec559E_M_cfile_ZNSt14numeric_limitsIfE12min_exponentE_ZN4sigc8internal11signal_implaSERKS1__ZNSt14numeric_limitsImE9is_moduloE__timer_t_ZNSt14numeric_limitsIsE6digitsE_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE6insertENS_13slot_iteratorIS6_EERKS6__ZNSt18_Vector_alloc_baseIPN7modglue5opipeESaIS2_ELb1EE13_M_deallocateEPS2_jpthread_rwlockattr_t_M_add_reference_ZNSt14numeric_limitsIwE14min_exponent10E_ZNSt12__basic_fileIcE6xsputnEPKci__off64_t__names_ZNSt10ctype_base5cntrlE__type_traits_ZN4sigc7signal1IbRN7modglue5ipipeENS_3nilEE5slotsEv_ZNSt11__ios_flags12_S_showpointE__int8_t_IO_read_base_M_references_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE9push_backERKS2___num_base_ZNKSt4listIN4sigc9slot_baseESaIS1_EE13get_allocatorEv_S_skipws_M_init_G_uint32_t_ZNK4sigc7signal1IbRN7modglue11ext_processENS_3nilEEclES3_ctype~vector_ZNKSaIcE7addressERKcfloat_denorm_style_ZNSt24__default_alloc_templateILb1ELi0EE10reallocateEPvjj_ZNSbIwSt11char_traitsIwESaIwEE7_M_leakEv_ZN4sigc13lambda_actionINS_7logicalINS_4and_EEEEaSERKS4__ZNSt13_Bit_iteratorppEinumeric_limitslambda_action >_M_dataplusvisit_each_type > >_ZN4sigc19lambda_action_unaryINS_13unary_bitwiseINS_4not_EEEEaSERKS4__ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEEaSERKS6__ZN7modglue11ext_process15dup_unix_pipes_Ev_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE9push_backERKS6_magic_ZN7modglue11ext_process17close_parentside_Ev_ZNSt4listIN4sigc9slot_baseESaIS1_EE6removeERKS1_slot_const_iterator >_ZNSt14numeric_limitsItE11round_errorEv_ZNSaIcE6rebindIcEaSERKS1__ZNSt4listIN4sigc9slot_baseESaIS1_EE4rendEv_ZNSt14numeric_limitsIfE10denorm_minEv_M_next_ZNSt6vectorISsSaISsEE5clearEv_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE4swapERS4__ZNSt8ios_base8internalE_ZNSt24__default_alloc_templateILb1ELi0EE11_S_end_freeE_ZN4sigc11signal_base5eraseESt14_List_iteratorINS_9slot_baseERS2_PS2_Eargv__ZNK4sigc13slot_iteratorINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEptEv_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE11equal_rangeERS3__ZNSt6vectorISsSaISsEE6insertEN9__gnu_cxx17__normal_iteratorIPSsS1_EEjRKSs_ZN4sigc8internal10slot_call1INS_16pointer_functor1IRN7modglue5ipipeEbEEbS5_E7addressEv_M_dispose_ZNSt13_Alloc_traitsISt4pairIKSsiESaIS2_EE15_S_instancelessE__type_traits_ZNSt12__enc_traits20_M_get_in_descriptorEvfloat_t_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_jj_ZNSt14numeric_limitsImE14is_specializedE_ZNSt14numeric_limitsItE8digits10E_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE4rendEv__uint32_teq_int_typefptrround_toward_infinity_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE5beginEv_ZNK4sigc8internal14lambda_select4clEv_ZNSt14numeric_limitsIaE10is_boundedE_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE8key_compEv_ZN7modglue11ext_processaSERKS0__Z18receive_exitstatusRN7modglue11ext_processE_S_extra_categories_size_ZNSaIvEaSERKS__ZNK4sigc7signal1IbRN7modglue11ext_processENS_3nilEE5slotsEv__class_type_info_pseudo_ZNSt19_Rb_tree_alloc_baseISt4pairIKSsiESaIS2_ELb1EEaSERKS4__ZNK4sigc9trackable13callback_listEv_ZNSt6locale18_S_categories_sizeEinsert_equal_ZNSt14numeric_limitsIeE9quiet_NaNEv_M_clone_node_ZNSt14numeric_limitsIlE3maxEv_Is_integer_ZNSt21__numeric_limits_base15tinyness_beforeE_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue11ext_processEbEEE14is_base_class_EPS1__ZNSt13_Alloc_traitsISt10_List_nodeIN4sigc9slot_baseEESaIS2_EEaSERKS5_~__enc_traits_ZNSaIN4sigc8internal18trackable_callbackEE9constructEPS1_RKS1_failurepthread_attr_t_ZNSt14numeric_limitsIfE13has_quiet_NaNE_ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKwj_Alloc_traits >_M_remove_reference_M_rootemitter_type_ZN4sigc11signal_base5clearEv_ZNSt18_Vector_alloc_baseIPN7modglue5ipipeESaIS2_ELb1EE13_M_deallocateEPS2_jdestroy___codecvt_do_always_noconv_ZNSt6vectorIPN7modglue5opipeESaIS2_EE2atEj_ZNSt14numeric_limitsIsE15tinyness_beforeEhas_quiet_NaN_ZNSt14numeric_limitsIxE8is_exactE_ZNSs2atEj_ZNSt14numeric_limitsIeE3minEv_ZNSt14numeric_limitsIjE10denorm_minEv_ZNSt11char_traitsIcE11eq_int_typeERKiS2_iterator_ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_12slot_do_bindEEaSERKS5___useconds_t_ZNSt14numeric_limitsIcE14max_exponent10E__normal_iterator > >_IO_lock_t__fct_ZNSt14_Bit_referenceaSERKS__ZNSt6vectorIPN7modglue5opipeESaIS2_EE3endEv_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE5beginEv__nsteps_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE6rbeginEv_ZNSt14numeric_limitsIdE12max_exponentE__ctype_type_ZNSt14numeric_limitsIeE8digits10E_ZNKSbIwSt11char_traitsIwESaIwEE7compareERKS2__ZN13__type_traitsIcEaSERKS0___priority_IO_write_base_ZNK4sigc8internal14slot_do_unbindclEPKNS_9trackableE__spinlock_S_badbittraits_type_ZNSt8ios_base17_M_call_callbacksENS_5eventE_M_empty_initialize_ZNSt4listIN4sigc9slot_baseESaIS1_EE6rbeginEvtype_traitslot_List_base >_ZNSt14numeric_limitsIwE9is_moduloE_ZNSt6vectorISsSaISsEE4rendEv_ZN16__pthread_attr_saSERKS__ZNSt14numeric_limitsIdE12has_infinityE_ZNSspLEPKc_ZNSt14numeric_limitsIfE10is_integerE_S_ios_destroy_ZNSt14numeric_limitsIbE10has_denormE_ZN12__gconv_infoaSERKS__ZNSt21__numeric_limits_base5radixE_ZNSt14numeric_limitsIhE6digitsEnot_equal_to_ZNSt14numeric_limitsIiE10has_denormE_ZNSt11__ios_flags6_S_octE_ZN13__type_traitsIfEaSERKS0__ZNSt11char_traitsIcE6lengthEPKc_ZNSt14numeric_limitsIhE12has_infinityE_ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_14slot_do_unbindEE9with_typeILb0ENS_16pointer_functor1IRN7modglue5ipipeEbEEE8execute_ERKSB_RKS5__ZNSbIwSt11char_traitsIwESaIwEE3endEvselect_loop__ZNSt11char_traitsIwE7not_eofERKjxalloc_pthread_cleanup_buffer_Is_integer_Vector_alloc_base,true>__clear_ZNKSt4fposI11__mbstate_tEneERKS1___simple_alloc >_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE3endEvITIMER_PROF_ZNSt14numeric_limitsIaE11round_styleE_ZN4sigc13lambda_actionINS_10arithmeticINS_7modulusEEEEaSERKS4__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE13insert_uniqueESt17_Rb_tree_iteratorIS2_RS2_PS2_ERKS2_build_pipe_list_M_put_nodeoutputcopyfmt_event_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE5eraseEN9__gnu_cxx17__normal_iteratorIPS2_S4_EES8___to_name_ZNSt11__ios_flags12_S_uppercaseEmon_thousands_sep_ZN4sigc10type_traitINS_12adaptor_baseEEaSERKS2__ZNSbIwSt11char_traitsIwESaIwEE6resizeEjw__type_traitsvector >_ZN4sigc3or_aSERKS0__ZNSbIwSt11char_traitsIwESaIwEE6appendEjw_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE4findERS3__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE5eraseERS1__ZNSt17_Swap_lock_structILi0EE12_S_swap_lockE_ZNSt26bidirectional_iterator_tagaSERKS___type_traits_ZNSt14numeric_limitsIfE13signaling_NaNEvstdin__simple_alloc >_List_alloc_base,true>_ZNKSt6localeneERKS__ZNSt6locale5_Impl18_M_check_same_nameEv_ZNSt11char_traitsIcE11to_int_typeERKc_ZNSt6locale5_Impl14_S_id_monetaryEoperator()parent_typebasic_ostream >_M_callbacks_ZN13__type_traitsIxEaSERKS0__S_initialize__itimer_which_t_ZNSt14numeric_limitsIxE10is_boundedE_ZNSt8ios_base6skipwsE_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE14_M_fill_assignEjRKS2__ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE3endEv__ino_t_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE8pop_backEv_ZNSt14numeric_limitsIsE13signaling_NaNEv__default_alloc_template_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE5countERS3__ZNSt14numeric_limitsIiE9is_iec559E_ZN13__type_traitsIeEaSERKS0___count_ZNSt6locale7collateE__quad_t__u_longadaptor_functorallocator_type_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEEaSERKS7__ZNSt6vectorISsSaISsEE5eraseEN9__gnu_cxx17__normal_iteratorIPSsS1_EES5__ZNSt6vectorIPN7modglue5opipeESaIS2_EE5eraseEN9__gnu_cxx17__normal_iteratorIPS2_S4_EES8___dsh_ZNSt14numeric_limitsIhE14min_exponent10E_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE7_S_leftEPSt18_Rb_tree_node_base_ZN4sigc18deduce_result_typeINS_16pointer_functor1IRN7modglue11ext_processEbEES4_vvvvvvLb0EEaSERKS6__Is_integer_ZNSaIN4sigc9slot_baseEE9constructEPS0_RKS0__ZNSt14numeric_limitsIxE12max_exponentE_Vector_alloc_base, std::allocator >,std::allocator, std::allocator > >,true>_ZN5lconvaSERKS_receive_html_M_int_enc_ZNSt8ios_base7goodbitE_ZNSt14numeric_limitsIeE11round_styleE_ZNSt13_Alloc_traitsISt10_List_nodeIN4sigc8internal18trackable_callbackEESaIS3_EE15_S_instancelessEslot_call1,bool,modglue::ext_process&>_M_get_external_bomint_p_cs_precedes_ZN7modglue4main15select_callbackEi_S_boolalphaforward_iterator_tag_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE5eraseERS3_connected_ZNSt14numeric_limitsIdE8is_exactEself__M_ios_iostate_end_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE5emptyEv__gconv_step_ZNSt12_Vector_baseIPN7modglue5opipeESaIS2_EEaSERKS4_deduce_result_type,modglue::ext_process&,void,void,void,void,void,void,false>_wide_vtable_S_initialized_ZNSt14numeric_limitsIhE10is_boundedE_ZNSt6locale9_S_globalE_ZN7modglue4main3runEi_ZN4sigc8internal12signal_emit1IbRN7modglue11ext_processENS_3nilEE4emitEPNS0_11signal_implES4__ZNSt14numeric_limitsIaE11round_errorEvnumeric_limits_M_node_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE5eraseEN9__gnu_cxx17__normal_iteratorIPS2_S4_EEint_p_sign_posnucontext_t_ZNSt14numeric_limitsIxE3minEv_ZNK4sigc16pointer_functor1IRN7modglue5ipipeEbEclES3__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE4findERS1_bufsiz_ZN4sigc8internal12signal_emit0IvNS_3nilEE4emitEPNS0_11signal_implE_ZNK4sigc7signal1IbRN7modglue5ipipeENS_3nilEE4emitES3__ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE4backEv__w_stopsigfunctor_type_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE12insert_equalERKS2___wchb_ZNKSs4findEcj__uint16_t_ZN4sigc13lambda_actionINS_10relationalINS_7greaterEEEEaSERKS4__ZN4sigc13functor_traitINS_16pointer_functor1IRN7modglue11ext_processEbEELb1EEaSERKS6__ZNSt11char_traitsIwE4copyEPwPKwj_ZN7modglue4main12select_loop_Eiwint_t_ZNSt19_Bit_const_iteratormIEitm_mday_ZNSt14numeric_limitsIyE10has_denormE_ZNKSs8capacityEv__normal_iterator, std::allocator >*,std::vector, std::allocator >, std::allocator, std::allocator > > > >_ZNK4sigc8internal8slot_rep3dupEv_ZNSt14numeric_limitsIcEaSERKS0__ZNSt6locale5_Impl19_S_facet_categoriesE_S_id_numericgregset_t_ZN12__false_typeaSERKS_input_pipes_~map_M_ext_encbinary_functiondestroy_node_IO_codecvtvisit_each, sigc::pointer_functor1 >_ZN4sigc6assignaSERKS0__ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwsetup_pipes_from_string__ZNSt14numeric_limitsIiE11round_styleE_ZNSt14numeric_limitsIbE8digits10E_Bit_reference__scope_ZNSt11__ios_flags12_S_boolalphaEfunction_type_M_coloropen_pipes__ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue11ext_processEbEEE19avoid_gcc3_warning_Ev_ZNK4sigc9slot_base7blockedEv_Is_integer_List_iterator_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE6rbeginEv_ZNSt14numeric_limitsImE7epsilonEv_ZN4sigc13adaptor_traitINS_16pointer_functor1IRN7modglue11ext_processEbEELb0EEaSERKS6__ZNKSt4fposI11__mbstate_tEeqERKS1__ZNSt14numeric_limitsIyE5radixE_ZNSt14numeric_limitsIxE14is_specializedEretval_ZNSt14numeric_limitsImE10is_integerE_ZNSt12__basic_fileIcE7seekposElSt13_Ios_Openmode_ZNSt14numeric_limitsImE15has_denorm_lossE_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE3endEvlambda_action >lambda_action >_ZNSt18_Rb_tree_node_baseaSERKS_args_ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEjjjallocatormon_decimal_point_ZNSt6vectorIPN7modglue5opipeESaIS2_EE8pop_backEvfunc__ZNSt14numeric_limitsImE3minEv_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE14_M_range_checkEjlambda_action_unary >_ZNKSbIwSt11char_traitsIwESaIwEE6rbeginEv_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwj_ZNSt8ios_base4Init14_S_initializedEv_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE5beginEv_ZNSt14numeric_limitsIsE8digits10Ehas_denorm_lossreverse_iterator >reverse_iterator<__gnu_cxx::__normal_iterator, std::allocator > > >_IO_buf_base_ZN13__type_traitsImEaSERKS0_allocatorcount_void_M_deallocate_ZNSt13_Alloc_traitsISt10_List_nodeIN4sigc9slot_baseEESaIS2_EE15_S_instancelessE_ZNSt14numeric_limitsIbE9is_iec559E_ZN13__type_traitsIhEaSERKS0__ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2__ZNSt14numeric_limitsIaE14max_exponent10E_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIPKwS2_EES8__ZNSt8ios_base5truncE_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE9_S_parentEPSt18_Rb_tree_node_base_S_end_free__type_traits_ZN4sigc19lambda_action_unaryINS_11unary_otherINS_11dereferenceEEEEaSERKS4___qaddr_t_ZNSt14numeric_limitsIeE9is_signedE__cd_in_Bit_iterator_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_12slot_do_bindEEENS_16pointer_functor1IRN7modglue11ext_processEbEEEEvRKT_RKT0__ZNSt14numeric_limitsIiE10denorm_minEv_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE8max_sizeEv_ZNSsaSEPKc_ZNSt14numeric_limitsImE11round_styleE_ZNSt10ctype_base6xdigitEis_specialized_ZNK4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE4backEv_ZN11sigaltstackaSERKS__ZNSt8ios_base4leftE_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE8capacityEv_ZNSt18_Bit_iterator_base10_M_bump_upEv_ZN4sigc13lambda_actionINS_14bitwise_assignINS_10rightshiftEEEEaSERKS4_execute_greg_tsigev_valuenumeric_limits_ZNSt14numeric_limitsIsE17has_signaling_NaNE_ZN4sigc7signal1IbRN7modglue11ext_processENS_3nilEE5slotsEv_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE5eraseESt17_Rb_tree_iteratorIS4_RS4_PS4_ESA_sigaltstack_ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_julong_ZNSt19_List_iterator_base7_M_decrEv__normal_iterator, std::allocator > >_ZNSt14numeric_limitsIfE9quiet_NaNEv_ZNKSs6_M_repEvimpl__ZNSt6locale13_S_categoriesEdereferenceselect_callback_ZNSt14numeric_limitsIwE5radixE_ZNSt12__enc_traits11_S_max_sizeE_M_fill_assign__initsignificand~ios_base_ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue11ext_processEbEEE7destroyEPvwith_type >_ZNSt11char_traitsIcE2eqERKcS2__S_trunc_ZNSt6vectorISsSaISsEE3endEvwgettreverse_iterator >_ZN4sigc10multipliesaSERKS0_reverse_iterator<__gnu_cxx::__normal_iterator > > >_ZNSt14numeric_limitsIaE12has_infinityE_ZNSt11__new_alloc10deallocateEPvj_ZNK4sigc8internal14temp_slot_list5beginEv_ZN4sigc13lambda_actionINS_10relationalINS_10less_equalEEEEaSERKS4_u_int32_tvalue_compappend_ZNSt14numeric_limitsIbE3minEv_ZNSbIwSt11char_traitsIwESaIwEEpLERKS2__ZNSt4listIN4sigc9slot_baseESaIS1_EE6spliceESt14_List_iteratorIS1_RS1_PS1_ERS3_S7_remove_callback_ZNSt6locale5_Impl16_M_install_cacheEPSt19__locale_cache_basei_ZNKSs5rfindEPKcj_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE5eraseESt17_Rb_tree_iteratorIS2_RS2_PS2_E_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryaSERKS3__ZNSt14numeric_limitsIwEaSERKS0__ZNSt6vectorISsSaISsEE14_M_fill_assignEjRKSs_ZNSt14numeric_limitsIsE12max_exponentE_A_arg1_ZNSt14numeric_limitsIbE10denorm_minEv_ZNKSs7_M_dataEv_ZNSbIwSt11char_traitsIwESaIwEE5beginEv_S_internal_IO_jump_t__stackaddrnonelambda_action >_ZNSt14numeric_limitsIxE12min_exponentE_ZNSt14numeric_limitsIdE13signaling_NaNEv_ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_14slot_do_unbindEEaSERKS5__ZNSt14numeric_limitsIjE9is_signedEreinterpret__ZNSt6locale10_S_classicEoperator streamoff_S_out_ZNSt14numeric_limitsIfE11round_styleE_ZNKSs6substrEjj_M_offpre_decrement_ZNSt11__ios_flags6_S_appElocale_data_M_transfer_ZNSaIwE6rebindIcEaSERKS1__fxsr_stmultiplies_M_node_count_ZNSt14numeric_limitsIxE10denorm_minEv_Bit_iterator_base~basic_string_ZNSt14numeric_limitsIdE8infinityEv_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EEbasic_streambuf >difference_type_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE5clearEv_ZNK4sigc9slot_base5emptyEv_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE5beginEv__canceltypelimit_derived_targetis_bounded_S_normalize_category_ZNSt14numeric_limitsIaE9is_iec559Etyped_slot_rep >_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE5frontEv_ZNSt14numeric_limitsIfE14min_exponent10E_ZNSt14numeric_limitsIaE9is_moduloE_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE7reserveEj_ZNSt15_STL_mutex_lock13_M_initializeEv_ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_14slot_do_unbindEE9with_typeILb0ENS_16pointer_functor1IRN7modglue11ext_processEbEEE8execute_ERKSB_RKS5_modulus_ZNSt14numeric_limitsImE13has_quiet_NaNE_ZN7modglue4main9sig_chld_Ei_ZNSt11__ios_flags6_S_decE_ZN11_Is_integerIwEaSERKS0___int16_t_M_leak_ZNSt24__default_alloc_templateILb1ELi0EE17_S_freelist_indexEj_ZNSt6vectorIPN7modglue5opipeESaIS2_EE6rbeginEv_ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmodebunblock_ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv_ZNSt14numeric_limitsIiE12has_infinityE__int32_t_ZNSs7_M_leakEv._10_ZNSt11char_traitsIwE6assignEPwjw._12._13._14_ZNSt14numeric_limitsIjEaSERKS0_._16._17._18_ZNSt14numeric_limitsIsE14min_exponent10E_Rep_type_ZNSt14numeric_limitsIaE3minEv_ZN7modglue11ext_process5pauseEvtm_sec_ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE5eraseENS_13slot_iteratorIS6_EEseekpthread_mutex_t_ZNSt14numeric_limitsIdE6digitsEround_toward_zero_ZN4sigc8internal8slot_rep10disconnectEvexit_code_ZNSt12__enc_traits21_M_get_out_descriptorEvdata__ZNSt14numeric_limitsIjE7epsilonEvupper_bound_ZN13__type_traitsIbEaSERKS0__ZNSt14numeric_limitsIxE5trapsE_ZNSt12__enc_traitsaSERKS__ZNSt13_Bit_iteratorppEv_ZNSt6locale7classicEv__rw_readers_ZNSt6vectorISsSaISsEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPSsS1_EERKSs_ZNSt14numeric_limitsItE10is_integerE_ZNKSt4listIN4sigc9slot_baseESaIS1_EE6rbeginEv_ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEj_ZNSbIwSt11char_traitsIwESaIwEE4_Rep7_M_grabERKS1_S5__ZN4sigc8internal23trackable_callback_list5clearEv_ZN4sigc8internal12signal_emit1IbRN7modglue5ipipeENS_3nilEEaSERKS6__ZN4sigc9slot_base10disconnectEv_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE8_S_colorEPSt18_Rb_tree_node_basebidirectional_iterator_tag_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjjw_ZNSt19_Rb_tree_alloc_baseISt4pairIKSsiESaIS2_ELb1EE11_M_put_nodeEPSt13_Rb_tree_nodeIS2_Eevent_callback_Is_integer_S_bin_M_check_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE5frontEv__normal_iterator, std::allocator > >_ZNSt10_List_nodeIN4sigc8internal18trackable_callbackEEaSERKS3_is_base_and_derived >_ZNSt12__basic_fileIcE10sys_ungetcEi_ZNSt14numeric_limitsIeE10is_integerE_M_prev_ZNSt14numeric_limitsIiE8infinityEv_ZN6_fpregaSERKS__ZNSt14numeric_limitsIdE3maxEv_ZN4sigc15adaptor_functorINS_16pointer_functor1IRN7modglue11ext_processEbEEE18deduce_result_typeIS4_vvvvvvEaSERKS8_float_round_style__fsh_ZNKSs4_Rep12_M_is_leakedEvmin_exponent10_ZNSt14numeric_limitsIsE10has_denormE~_STL_auto_lock_ZNK4sigc8internal14lambda_select3clEv._30._31._32._33._34._35receive_info_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE8pop_backEv_ZNSt11char_traitsIwE2ltERKwS2__ZNSt14numeric_limitsIsE10denorm_minEv_ZNSt8ios_base11adjustfieldE_ZNSt13_Alloc_traitsIPN7modglue11ext_processESaIS2_EEaSERKS4_~slot_ZNKSaIwE8max_sizeEv_ZNKSs4sizeEv__simple_alloc, std::allocator >, int> >,std::__default_alloc_template >_ZNSt14numeric_limitsIiE14is_specializedE_ZN13__type_traitsItEaSERKS0___gconv_trans_context_fct_ZNKSs7compareERKSs_M_goodvalue_typeinsert_unique_S_node_allocator_lock_ZNSt14numeric_limitsIdE10is_integerE_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwjj_ZNSt16_List_alloc_baseIN4sigc8internal18trackable_callbackESaIS2_ELb1EEaSERKS4_is_integer_ZNSt14numeric_limitsIyE12max_exponentE__timezone_ptr_t_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei_ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_12slot_do_bindEE9with_typeILb0ENS_16pointer_functor1IRN7modglue11ext_processEbEEE8execute_ERKSB_RKS5__M_os_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5__ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue5ipipeEbEEE14is_base_class_EPS1__ZNSt11__ios_flags11_S_internalE_ZN7_xmmregaSERKS_is_base_class__ZNSt20forward_iterator_tagaSERKS__ZNK4sigc9trackable30remove_destroy_notify_callbackEPv_ZN4sigc10connection5blockEb_ZNSt11__ios_flags6_S_hexElambda_action >_ZNSt14numeric_limitsItE12max_exponentE_ZNSt4listIN4sigc9slot_baseESaIS1_EE6resizeEj_ZNSt14numeric_limitsIyE11round_styleEfunctor_trait,true>_ZNSt14numeric_limitsIyE17has_signaling_NaNEtemp_slots__ZNKSbIwSt11char_traitsIwESaIwEE7_M_foldEjj__codecvt_result_ZNSt14numeric_limitsItE9is_signedE_ZNSt14numeric_limitsIyE6digitsE_ZNSt14numeric_limitsIbE11round_errorEv_ZNK4sigc15adaptor_functorINS_16pointer_functor1IRN7modglue11ext_processEbEEEclEv_ZN13_libc_fpstateaSERKS__ZN4sigc9slot_listINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEE4rendEv_ZNKSaIN4sigc9slot_baseEE7addressERS0__ZNSt18input_iterator_tagaSERKS__ZNSt12__enc_traits19_M_get_internal_encEv_M_leftmostnot__ZN4sigc8internal18trackable_callbackaSERKS1__M_lock_M_mutate_ZNSt4listIN4sigc9slot_baseESaIS1_EE6spliceESt14_List_iteratorIS1_RS1_PS1_ERS3_S7_S7_._57._58._59_ZNSt6locale5_Impl12_M_get_cacheEj_ZNSt6locale21_S_normalize_categoryEj_ZN4sigc8internal10slot_call1INS_16pointer_functor1IRN7modglue5ipipeEbEEbS5_EaSERKS7_syncreverse_iterator, std::allocator >, int>, std::pair, std::allocator >, int>&, std::pair, std::allocator >, int>*> >_ZNSt14numeric_limitsIsE8is_exactE_Rb_tree_node, std::allocator >, int> >_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refdataEv__rw_lock_ZNKSaIcE7addressERc_ZN4sigc8internal10slot_call1INS_16pointer_functor1IRN7modglue5ipipeEbEEbS5_E7call_itEPNS0_8slot_repES5__Is_integer__mem_ZNSt10ctype_base5digitEfind_last_not_of_M_left_ZNSs4_Rep10_M_destroyERKSaIcE_ZNSt4fposI11__mbstate_tEplEl_ZNSi6sentryaSERKS_._60._61._62._63_M_streambuf_statesys_getcwstreampos_ZNSt14numeric_limitsIlE14max_exponent10E_ZNSbIwSt11char_traitsIwESaIwEE4nposElambda_action >_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEEaSERKS7__ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE5beginEv__rw_write_waiting_ZNSt6vectorIPN7modglue5opipeESaIS2_EE14_M_fill_assignEjRKS2___max_needed_to_ZNKSbIwSt11char_traitsIwESaIwEE4dataEv_M_bump_downint_n_sign_posn_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwjlambda_action >_ZNSt14numeric_limitsIlE11round_errorEv_ZNSs4_Rep13_M_set_leakedEv_ZNSs6resizeEjc_M_ref_count_S_copy_chars_ZNSt14numeric_limitsIyE14max_exponent10E_ZNSs6appendEjc._72._73._75._78_ZNK7modglue4main8add_fds_ER6fd_setS2_Ri_ZN4sigc13lambda_actionINS_17arithmetic_assignINS_7modulusEEEEaSERKS4_numeric_limits_ZNSt14numeric_limitsIyE9is_signedE_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPNS_5facetE_Vector_base >_ZNK4sigc15adaptor_functorINS_16pointer_functor1IRN7modglue5ipipeEbEEEclEv_ZNSt14numeric_limitsIjE3minEvshort int_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE4backEv_ZNSt14numeric_limitsIfE10is_boundedE__dev_t_ZN4sigc8internal11signal_impl6notifyEPv_ZNSt14numeric_limitsIiE17has_signaling_NaNEslot1 >openmode_ZN4sigc10connection10disconnectEv_ZNSt8ios_base3begE_ZNSt18_Vector_alloc_baseISsSaISsELb1EEaSERKS1__ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE13get_allocatorEv_M_range_check__gthread_mutex_t_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE3endEv_ZNSt14numeric_limitsIsE8infinityEv_ZNSt10_List_baseIN4sigc8internal18trackable_callbackESaIS2_EE7__clearEv_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEEaSERKS7_sig_chld_pipe_round_indeterminate_ZNSt14numeric_limitsItE5trapsE_ZNKSt16_List_alloc_baseIN4sigc9slot_baseESaIS1_ELb1EE13get_allocatorEv_ZNSt6locale13_S_initializeEv_ZNSt10_List_nodeIN4sigc9slot_baseEEaSERKS2_reverse_iterator >_ZNSt14numeric_limitsIbE13signaling_NaNEv_ZNSt21__numeric_limits_base9is_signedE_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE14_M_fill_assignEjRKS2_pipes_done___codecvt_error_ZNK7modglue11ext_process10input_pipeERKSs_S_parent_ZNSt14numeric_limitsIwE3maxEv_pthread_descr_struct~signal_impl_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE5clearEv__u_quad_t_ZNKSs7compareEjjPKcj_ZNSt14numeric_limitsIwE10has_denormE_ZNKSt4fposI11__mbstate_tE11_M_positionEv_ZNSt14numeric_limitsIeE13has_quiet_NaNE_ZNSs12_Alloc_hideraSERKS__ZNKSt4listIN4sigc9slot_baseESaIS1_EE4rendEv_S_swap_lock_ZN13__type_traitsIiEaSERKS0__ZNSt14numeric_limitsIaE17has_signaling_NaNE_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE14_M_create_nodeERKS2__ZNSt14numeric_limitsIlE9is_iec559E~Initreverse_iterator<__gnu_cxx::__normal_iterator, std::allocator > > >_ZNSt6vectorISsSaISsEE2atEjand__ZN4sigc13lambda_actionINS_7bitwiseINS_4xor_EEEEaSERKS4__ZNSt18_Vector_alloc_baseIPN7modglue5ipipeESaIS2_ELb1EE11_M_allocateEjstdout_ZNSt11char_traitsIwE4findEPKwjRS1__ZNSt14numeric_limitsImE8digits10Ebasic_istream >_ZNSt14numeric_limitsIdE14min_exponent10E_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_j_M_check_same_name_Callback_list_M_exception_ZN4sigc4lessaSERKS0__ZN4sigc8internal11signal_impl14reference_execEv_M_ios_locale_S_dec_S_id_ctypedeferred__ZNK4sigc13slot_iteratorINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEdeEv_M_iend_ZNKSt6locale4nameEv_M_replace_categories_ZNSt14numeric_limitsIxE7epsilonEv_ZNSt6vectorISsSaISsEE9push_backERKSstm_isdst_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwjj_ZN4sigc10type_traitINS_9trackableEEaSERKS2_si_uid_ZN11_libc_fpregaSERKS_type_traittimespec_sigev_thread_A_actionlambda_action_unary >round_error_ZNSt19_Bit_const_iteratorppEiold_sigaction_chld__ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_NS4_IPKwS2_EES9__ZNKSt8ios_base6getlocEv_S_fixed_ZNSt14numeric_limitsIlE9is_signedE_ZNSt14numeric_limitsIxE8infinityEvtm_wday_ZNSt19_Bit_const_iteratorppEv_fpxreg_IO_cookie_io_functions_t_ZNSt14numeric_limitsIsE12has_infinityEreceive_exitstatus_ZN4sigc13lambda_actionINS_7bitwiseINS_10rightshiftEEEEaSERKS4__ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue5ipipeEbEEE3dupEPv_M_end_of_storageequal_range_ZNSt14numeric_limitsIjE15has_denorm_lossEtz_minuteswestoperator[]__blkcnt64_t_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE2atEj__locale_cache_base_ZNSt14numeric_limitsIlE9is_moduloEsetup_signal_handlers__ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE11lower_boundERS3__S_force_new_ZNKSt18_Vector_alloc_baseIPN7modglue5opipeESaIS2_ELb1EE13get_allocatorEv_ZNKSt6vectorIPN7modglue11ext_processESaIS2_EE13get_allocatorEvrep_type_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE6rbeginEv_ZNKSt6vectorISsSaISsEE5beginEv_S_oct_ZNSt14numeric_limitsIfE9is_moduloE_ZNSt6vectorIPN7modglue5opipeESaIS2_EE4rendEv_ZNSt6locale7numericE_ZN4sigc4slotIbRN7modglue5ipipeENS_3nilES4_S4_S4_S4_S4_EaSERKS5_call___simple_alloc, std::allocator >,std::__default_alloc_template >_ZNSt14numeric_limitsImE5radixE__gconv_end_fct_ZN4sigc8internal10slot_call1INS_16pointer_functor1IRN7modglue11ext_processEbEEbS5_E7addressEv_ZNSt11__ios_flags6_S_binE_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwjj__ctype_touppersi_code_ZNSt14numeric_limitsIfE12max_exponentE_ZNSt11__ios_flags6_S_ateE_ZNSt11char_traitsIcE4findEPKcjRS1__S_value_ZN11_Is_integerIaEaSERKS0__ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEjw_ZNSt6vectorIPN7modglue5opipeESaIS2_EE6assignEjRKS2__ZNKSt13_Bit_iteratorplEi_S_floatfieldallocator_S_adjustfieldITIMER_REALdup_unix_pipes__ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE5frontEv_ZNSt8ios_base9showpointE__gconv_step_dataa_rep_ZN4sigc8internal11signal_impl6insertESt14_List_iteratorINS_9slot_baseERS3_PS3_ERKS3__ZNSt19output_iterator_tagaSERKS__ZNSt14numeric_limitsIcE10denorm_minEv_ZNSt4listIN4sigc9slot_baseESaIS1_EE14_M_create_nodeEv_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE4swapERS4__M_is_shareddeduce_result_type__guardsize_ZNSs7replaceEjjRKSspthread_t_ZNSbIwSt11char_traitsIwESaIwEE6rbeginEv_ZNSt13messages_baseaSERKS__ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE5emptyEvcookie_close_function_t__btowc_fct_ZNSt11__ios_flags13_S_scientificE__atomic_add_ZNSt12__basic_fileIcE4syncEv__ba_lock_ZNSt14numeric_limitsItE14is_specializedE_ZNKSaIN4sigc8internal18trackable_callbackEE7addressERKS1__ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE11equal_rangeERS3__ZNSt4listIN4sigc9slot_baseESaIS1_EE6spliceESt14_List_iteratorIS1_RS1_PS1_ERS3__ZNSt24__default_alloc_templateILb1ELi0EE12_S_free_listE_ZNKSt14_List_iteratorIN4sigc9slot_baseERS1_PS1_EptEv_S_format_float_ZN11__true_typeaSERKS__ZNSt8ios_base3endE_ZN11_Is_integerIsEaSERKS0__S_construct_pattern_ZNK7modglue4main15build_pipe_listEv__mbstate_tpipebuf_ZNSt12__basic_fileIcE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode_ZNSt14numeric_limitsIlE8is_exactE_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE2atEj_ZNSbIwSt11char_traitsIwESaIwEE4_Rep13_M_set_leakedEv_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE6resizeEjRKS2__ZNSt14numeric_limitsIfEaSERKS0__ZNSbIwSt11char_traitsIwESaIwEEixEjdigits10signal_emit1_ZN4sigc19is_base_and_derivedINS_12functor_baseENS_16pointer_functor1IRN7modglue11ext_processEbEEEaSERKS7__ZNSt14_List_iteratorIN4sigc9slot_baseERKS1_PS2_EppEvuc_link_Vector_alloc_base,true>_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE4sizeEv_ZNSt14numeric_limitsImE10is_boundedE_ZNSbIwSt11char_traitsIwESaIwEE4_RepaSERKS3__ZNSt6vectorISsSaISsEE6rbeginEv_ZN15__locale_structaSERKS__ZNSt14numeric_limitsIaE3maxEvpair, std::allocator >,int>reverse_iterator > >ipipes_eflags__true_typeaddressint_n_cs_precedes_ZNSt14numeric_limitsIbE3maxEv_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKw_A_func_ZNSt8ios_base7_M_initEv_ZNSt11char_traitsIcE6assignEPcjc__rlim_tlimit_derived_target_ZNSt14numeric_limitsIdE7epsilonEvsv_flags_ZNSt14numeric_limitsItE12has_infinityE_ZNSt14numeric_limitsIxE9is_moduloE_ZNSt14numeric_limitsIjE14max_exponent10E_ZNSs7replaceEjjRKSsjjvector >_ZNSt15_List_node_baseaSERKS__ZNSbIwSt11char_traitsIwESaIwEE6insertEjjw_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE8pop_backEv_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE10_S_maximumEPSt13_Rb_tree_nodeIS2_E_ZNSbIwSt11char_traitsIwESaIwEEaSEw_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6resizeEj_Alloc_traits >_S_start_freeadd_destroy_notify_callbacksv_handler_ZNSt14_STL_auto_lockaSERKS__ZNSt14numeric_limitsIxEaSERKS0__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE7_M_copyEPSt13_Rb_tree_nodeIS2_ESB_iostate_sbuffunctor_trait__rw_kind_M_install_facet_ZNSt14numeric_limitsIwE14max_exponent10E_ZN7modglue4main9sig_term_Ei_ZN4sigc15visit_each_typeIPNS_9trackableENS_8internal14slot_do_unbindENS_15adaptor_functorINS_16pointer_functor1IRN7modglue5ipipeEbEEEEEEvRKT0_RKT1__ZNSt14numeric_limitsIiE15has_denorm_lossE_ZNKSs6rbeginEv_ZNSaIcE7destroyEPcfmtflags_ZNSt14numeric_limitsIjE8digits10E_ZNK4sigc7signal1IbRN7modglue11ext_processENS_3nilEE9make_slotEv_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE10value_compEv_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE7reserveEj_ZNSt14numeric_limitsIwE3minEv_ZNK4sigc8internal11signal_impl5emptyEv_ZNSt13_Alloc_traitsISt4pairIKSsiESaIS2_EEaSERKS4__ZNSt14numeric_limitsImE8infinityEv_attribute_ZNKSt6vectorISsSaISsEE5emptyEv_ZNSt14numeric_limitsIjE13has_quiet_NaNE_ZNKSaIwE7addressERwis_base_and_derived >_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE8_M_eraseEPSt13_Rb_tree_nodeIS2_Ecomparison_fn_t_ZNSt15binary_functionISsSsbEaSERKS0__ZNSspLEc_ZNSt21__numeric_limits_base10has_denormEvector, std::allocator >,std::allocator, std::allocator > > >_ZNSt14numeric_limitsIcE11round_errorEv_Alloc_traits >deduce_result_typenumeric_limits__prevclose_childside__ZNSt6locale4noneE_ZNSt13_Alloc_traitsISsSaISsEE15_S_instancelessE_ZN7modglue4main14sig_chld_pipe_E_ZN4sigc13lambda_actionINS_17arithmetic_assignINS_4plusEEEEaSERKS4_sa_maskiterator_category_ZNSt14numeric_limitsIiE5radixE~_Rb_tree_ZN4sigc12reinterpret_aSERKS0__ZN7modglue4main22setup_signal_handlers_Evpre_increment_ZNSt8ios_base4setfESt13_Ios_FmtflagsS0___ssh_ZNSbIwSt11char_traitsIwESaIwEE20_S_empty_rep_storageE_ZNKSs16find_last_not_ofEcj_ZNSt14numeric_limitsIfE9is_iec559Egreater_equalpthread_condattr_t__type_traitsclearing__Link_type_ZNSt8ios_base7unitbufErebind_ZNSt10__num_base13_S_format_intERKSt8ios_basePccc_ZNSt6locale2idaSERKS0__ZNSs4_Rep10_M_disposeERKSaIcE_ZNSt14numeric_limitsImE15tinyness_beforeE_ZNSt12__basic_fileIcE16showmanyc_helperEv_ZNSt26random_access_iterator_tagaSERKS__ZNSt13_Alloc_traitsIPN7modglue5ipipeESaIS2_EEaSERKS4_~signal_exec_ZN4sigc7signal1IbRN7modglue5ipipeENS_3nilEEaSERKS5__ZNSt14numeric_limitsImE13signaling_NaNEv_ZNSi6sentrycvbEv_List_alloc_base,true>_ZN7modglue11ext_processlsERKSs_ZNSt8ios_base9basefieldEdup__ZNKSt13_Bit_iteratordeEv_ZN4sigc13lambda_actionINS_10arithmeticINS_4plusEEEEaSERKS4__ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE11upper_boundERS3_denorm_indeterminate_ZN4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE4backEvdeduce_result_typesiginfo_tmcontext_t_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE6insertEN9__gnu_cxx17__normal_iteratorIPS2_S4_EEjRKS2_basic_streambuf >_ZNSt14numeric_limitsIbE10is_integerE__str_ZN4sigc19is_base_and_derivedINS_12adaptor_baseENS_16pointer_functor1IRN7modglue5ipipeEbEEE14is_base_class_Ez_ZNSt4listIN4sigc9slot_baseESaIS1_EE11_M_transferESt14_List_iteratorIS1_RS1_PS1_ES7_S7__ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwjsignal1tm_gmtoff_ZNSt14numeric_limitsImE11round_errorEv_ZN4sigc13lambda_actionINS_5otherINS_9subscriptEEEEaSERKS4__xmmreg__simple_alloc,std::__default_alloc_template >_ZNSt8ios_base20_M_dispose_callbacksEv_ZN17_pthread_fastlockaSERKS_unreference_ZNSt14numeric_limitsIlE5trapsE_ZNKSt19_List_iterator_baseneERKS__ZN11_Is_integerIhEaSERKS0__ZNSt14numeric_limitsIiE12min_exponentEdateorder_ZNKSaIN4sigc8internal18trackable_callbackEE8max_sizeEvdrand48_data_M_fill_insert_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE6insertEN9__gnu_cxx17__normal_iteratorIPS2_S4_EEjRKS2___state_type_ZNSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE6insertESt17_Rb_tree_iteratorIS4_RS4_PS4_ERKS4__ZNSt14numeric_limitsIcE9is_signedE_ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6rbeginEv_ZN4sigc19lambda_action_unaryINS_16unary_arithmeticINS_6negateEEEEaSERKS4__ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_j_ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE4backEv_ZNSt14numeric_limitsIeE12max_exponentE_ZNSt14numeric_limitsIbE11round_styleE_ZN4sigc9trackable16notify_callbacksEv_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE5eraseEN9__gnu_cxx17__normal_iteratorIPS2_S4_EExor___rw_read_waiting__swblk_t_ZNSt14numeric_limitsItE3maxEvofstream_ZNSs4_Rep9_S_createEjRKSaIcEgreater_ZNSt14numeric_limitsItE17has_signaling_NaNE__pthread_attr_sfd_set_Is_integer_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE3endEv_ZN4sigc8internal14lambda_select6aSERKS1__ZNSt14numeric_limitsIhE9quiet_NaNEv_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_j_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE14_M_create_nodeEv_ZNSt14numeric_limitsIiE8is_exactEadaptor_functor >reverse_ZNSt8ios_base5rightE_Vector_base >_ZN8sigeventaSERKS_seekdir_ZNSt14numeric_limitsIwE11round_errorEv_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S6_S6__ZNSaIcE10deallocateEPcj_ZNSt14numeric_limitsItE10is_boundedEseekoff_ZNK4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE6rbeginEvtype_trait_ZNSs4_Rep10_M_refdataEv_ZN4sigc8internal20limit_derived_targetIPNS_9trackableENS0_12slot_do_bindEE9with_typeILb0ENS_16pointer_functor1IRN7modglue5ipipeEbEEEaSERKSC__ZNKSt4listIN4sigc8internal18trackable_callbackESaIS2_EE5frontEv_ZN4sigc10type_traitINS_16pointer_functor1IRN7modglue11ext_processEbEEEaSERKS6_fpos<__mbstate_t>_ZNSt14numeric_limitsIsE12min_exponentE_ZNSt14numeric_limitsImEaSERKS0_slot >_ZN4sigc19is_base_and_derivedINS_9trackableENS_16pointer_functor1IRN7modglue11ext_processEbEEE3bigaSERKS8__ZNSt14numeric_limitsIeE14is_specializedE_ZN4sigc13lambda_actionINS_14bitwise_assignINS_4xor_EEEEaSERKS4__S_freelist_index_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE13insert_uniqueERKS2__ZNSt14numeric_limitsIwE8infinityEv_S_id_time_ZN6sigvalaSERKS__ZN4sigc11signal_base7connectERKNS_9slot_baseE_kill_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_map, std::allocator >,int,std::less, std::allocator > >,std::allocator, std::allocator >, int> > >_ZNKSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE11__rb_verifyEv_ZNSt10ctype_base5alphaE_M_copy_ZNSt14numeric_limitsIaE7epsilonEv_ZNSt14numeric_limitsIlE17has_signaling_NaNE_ZNSt6vectorIPN7modglue5ipipeESaIS2_EEaSERKS4__ZNSt14numeric_limitsIjE5trapsE_Vector_alloc_base_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE6spliceESt14_List_iteratorIS2_RS2_PS2_ERS4_S8___shlib_handle_ZNSt4listIN4sigc9slot_baseESaIS1_EE6resizeEjRKS1__ZNSt14numeric_limitsIhE9is_signedE_S_free_list_S_heap_size_ZNSaIN4sigc9slot_baseEE7destroyEPS0__ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE5mergeERS4__ZN7modglue4mainaSERKS0_mxcsr_ZNSt6vectorISsSaISsEE6insertEN9__gnu_cxx17__normal_iteratorIPSsS1_EERKSsallocatorss_flags__normal_iterator > >_ZNKSt3mapISsiSt4lessISsESaISt4pairIKSsiEEE4findERS3_output_pipes_ISOC__ZN7modglue4main24restore_signal_handlers_Ev_ZNSt14numeric_limitsIdE10is_boundedE_ZNSt14numeric_limitsIfE14is_specializedE_ZNSt24__default_alloc_templateILb1ELi0EE4_ObjaSERKS1__IO_backup_base_ZNSt14numeric_limitsIeE5radixE_ZNSt14numeric_limitsIbE8infinityEv__outbuf_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKw_sigpoll_M_length_ZNSt14numeric_limitsIiE3maxEvallocator_ZNSt14numeric_limitsIlE15tinyness_beforeEbound_const_mem_functor1,modglue::ext_process&>pthread_barrierattr_t_ZN9itimervalaSERKS__ZN4sigc8internal14lambda_select4aSERKS1__ZN9sigactionaSERKS__ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE4backEv_ZNSt14numeric_limitsIdE17has_signaling_NaNE_ZNK4sigc8internal12slot_do_bindclEPKNS_9trackableEsi_errno_ZNKSbIwSt11char_traitsIwESaIwEE7_M_iendEvlambda_action >__fmtfork_ZNKSt6vectorISsSaISsEE4rendEv_GLOBAL__I__Z12receive_htmlRN7modglue5ipipeE_ZN13__type_traitsIwEaSERKS0__ZNKSt4listIN4sigc9slot_baseESaIS1_EE8max_sizeEv_ZNSt14numeric_limitsIyE10is_integerE_ZNKSs5rfindEPKcjj_Rb_tree_alloc_base_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_functor_base_ZNSt4listIN4sigc9slot_baseESaIS1_EEaSERKS3__ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE7_S_leftEPSt13_Rb_tree_nodeIS2_E_ZNSt14__simple_allocISt10_List_nodeIN4sigc8internal18trackable_callbackEESt24__default_alloc_templateILb1ELi0EEEaSERKS7__Vector_base >_ZNSt14numeric_limitsIhE14max_exponent10E__gconv_trans_init_fct_ZN7modglue4main9last_readEv_ZNKSs8_M_checkEj_xmm_List_node_ZN4sigc10rightshiftaSERKS0_type_trait_ZNSt14numeric_limitsIxE8digits10E__id_t_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIS3_S2_EES6__ZNKSt6vectorISsSaISsEE5frontEv_ZNSt13_Alloc_traitsIN4sigc8internal18trackable_callbackESaIS2_EEaSERKS4__ZNKSt6vectorIPN7modglue5opipeESaIS2_EEixEj_ZNSt14numeric_limitsIhE5trapsE_ZNKSbIwSt11char_traitsIwESaIwEE5emptyEv_ZN7modglue4main3addEPNS_11ext_processEslotuse_wget.ccint_n_sep_by_space_M_getloc__wch_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE8max_sizeEvadaptor_typelist_pipes_slot1_ZNSt14numeric_limitsIwE10denorm_minEviterator_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2__ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEjwRKS1__M_leak_hard_ZNSt12__basic_fileIcE8sys_getcEv_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE13get_allocatorEvcookie_read_function_tsv_mask_ZNKSt19_Bit_const_iteratorplEi_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE4rendEvname__ZNSt14numeric_limitsIiE10is_integerE_ZNKSs5rfindERKSsj_ZNSt14numeric_limitsIcE5radixE_ZN13__type_traitsIyEaSERKS0_restore_signal_handlers__ZNSt4fposI11__mbstate_tE11_M_positionEl_M_ios_fmtflags_end__io_read_fn_ZN4sigc19lambda_action_unaryINS_11unary_otherINS_7addressEEEEaSERKS4__ZNSt8ios_base13_M_grow_wordsEi_ZNK4sigc8internal11signal_impl4sizeEv_ZN4sigc4plusaSERKS0__Alloc_traits_ZN4sigc8internal12signal_emit0IvNS_3nilEEaSERKS3_operator void*random_access_iterator_tag_ZNSt14numeric_limitsIdE9is_iec559E_ZNSt19_List_iterator_baseaSERKS__ZNSaIN4sigc9slot_baseEEaSERKS1__M_initialize_ZN4sigc8internal14temp_slot_listaSERKS1__ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S5_S5__ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE8pop_backEv_ZN4sigc8internal14lambda_select2aSERKS1__ZNKSs16find_last_not_ofEPKcjj_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE3endEv_ZN4sigc10connection6notifyEPv_ZN4sigc7greateraSERKS0__ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwj__rb_verify__type_traits_ZNSt18_Vector_alloc_baseISsSaISsELb1EE13_M_deallocateEPSsj_ZNSt6vectorISsSaISsEE8pop_backEv_Is_integerpositive_sign_ZNSt6vectorIPN7modglue5opipeESaIS2_EE7reserveEj_M_finish_ZN4sigc9subscriptaSERKS0__ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_jj_ZNSt10ctype_base5printEushort_ZNSt4listIN4sigc9slot_baseESaIS1_EE4sortEvcallback_list__ZN10sigcontextaSERKS__ZNSt21__numeric_limits_base14min_exponent10E_ZNSt14numeric_limitsIbEaSERKS0__ZNKSs7_M_foldEjj_ZNK4sigc9slot_listINS_4slotIbRN7modglue11ext_processENS_3nilES5_S5_S5_S5_S5_EEE5frontEv_M_fn_ZNSt13_Bit_iteratormmEiu_int64_tsi_addr_ZNSt15_STL_mutex_lockaSERKS_~trackable_callback_list_ZNSt21__numeric_limits_base11round_styleE_ZNSt10__num_base11_S_atoms_inE__clock_t_ZNSs6insertEjPKcj_ZNSt13_Bit_iteratormmEv_ZNSs4_Rep10_M_refcopyEvT_self_Rb_tree_alloc_base, std::allocator >, int>,std::allocator, std::allocator >, int> >,true>_ZNSt14numeric_limitsIsE9quiet_NaNEv_M_client_data_ZNSt14numeric_limitsIfE8is_exactE_ZNK4sigc5slot1IbRN7modglue5ipipeEEclES3___gconv_trans_query_fct_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS2_S4_EERKS2___type_traits_ZNKSs16find_last_not_ofERKSsj_ZNSt16_List_alloc_baseIN4sigc9slot_baseESaIS1_ELb1EEaSERKS3_allocator_ZNSt14numeric_limitsIsE5radixE_ZNSt10ctype_base5spaceEpointer_functor1_ZNSt11__ios_flags11_S_showbaseEoff_type_ZNKSt6vectorIPN7modglue5ipipeESaIS2_EE5beginEv_ZNSt14numeric_limitsIlE8infinityEv_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE6rbeginEv_ZN4sigc10type_traitINS_16pointer_functor1IRN7modglue5ipipeEbEEEaSERKS6__S_local_word_size__daddr_t_ZNSt14numeric_limitsIaE5radixE_ZNSt6locale6globalERKS__ZNSt14numeric_limitsImE14min_exponent10E_ZN4sigc8internal14temp_slot_list3endEv_libc_fpstate_ZNSaIN4sigc8internal18trackable_callbackEE10deallocateEPS1_jpop_frontreverse_iterator<__gnu_cxx::__normal_iterator > > >_ZNSt6vectorIPN7modglue5opipeESaIS2_EE5clearEv_ZNSolsEi_ZNSt14numeric_limitsItEaSERKS0_pair, std::allocator >, int>, std::pair, std::allocator >, int>&, std::pair, std::allocator >, int>*>,std::_Rb_tree_iterator, std::allocator >, int>, std::pair, std::allocator >, int>&, std::pair, std::allocator >, int>*> >__ba_waiting_ZNSt4listIN4sigc9slot_baseESaIS1_EE14_M_create_nodeERKS1__List_iteratornl_catdnumeric_limits_ZN4sigc13slot_iteratorINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEppEvnumeric_limits_ZNSt14numeric_limitsIwE8is_exactE_List_iterator_ZNSt14numeric_limitsIdE11round_errorEv__state__stackaddr_set_ZNSt4listIN4sigc8internal18trackable_callbackESaIS2_EE5frontEv_ZNSs6insertEjPKcucontext_ZNKSt4fposI11__mbstate_tE5stateEv_ZN13__type_traitsIlEaSERKS0__ZNSt16_List_alloc_baseIN4sigc9slot_baseESaIS1_ELb1EE11_M_get_nodeEvvector_type_M_get_node_ZN4sigc9trackableaSERKS0___gconv_fct_ZNKSsixEjtv_sec__simple_alloc, std::allocator >, int>,std::__default_alloc_template >_ZNSt13_Alloc_traitsISsSaISsEEaSERKS1___static_initialization_and_destruction_0_ZNSt21__numeric_limits_base13has_quiet_NaNE_ZNKSt6vectorIPN7modglue5opipeESaIS2_EE8max_sizeEv_S_terminal_ZNSt14numeric_limitsIdE8digits10Elambda_action >_vtable_offset_ZNKSt19_Rb_tree_alloc_baseISt4pairIKSsiESaIS2_ELb1EE13get_allocatorEv_ZN18__gconv_trans_dataaSERKS__M_id_ZN4sigc7signal1IbRN7modglue5ipipeENS_3nilEE7connectERKNS_4slotIbS3_S4_S4_S4_S4_S4_S4_EE_List_iterator_ZNSt6vectorIPN7modglue5ipipeESaIS2_EE5clearEvu_int8_t_ZNKSt18_Vector_alloc_baseISsSaISsELb1EE13get_allocatorEv_M_ios_openmode_end_ZNSs12_S_empty_repEv_ZNSsixEj_ZNSt14numeric_limitsIwE9is_signedE_ZNSt8_Rb_treeISsSt4pairIKSsiESt10_Select1stIS2_ESt4lessISsESaIS2_EE19_M_empty_initializeEv_ZNSt4listIN4sigc9slot_baseESaIS1_EE7reverseEv_ZNSt6vectorIPN7modglue11ext_processESaIS2_EE6resizeEj_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_14slot_do_unbindEEENS_16pointer_functor1IRN7modglue11ext_processEbEEEEvRKT_RKNS_15adaptor_functorIT0_EE_ZNSt14numeric_limitsIdE5trapsE_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_~slot_basedynamic_ostreamis_openis_base_and_derived >_ZN4sigc13slot_iteratorINS_4slotIbRN7modglue5ipipeENS_3nilES5_S5_S5_S5_S5_EEEppEi_ZNSt14__simple_allocISt10_List_nodeIN4sigc8internal18trackable_callbackEESt24__default_alloc_templateILb1ELi0EEE8allocateEj_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_max_sizeE_M_data_ZNSt4listIN4sigc9slot_baseESaIS1_EE5mergeERS3__ZNSt14numeric_limitsIcE14is_specializedE__caddr_t_ZNSt14numeric_limitsIcE9is_moduloE_ZNSt14numeric_limitsIdE3minEvï”;˜$šW›º™è™e˜ª˜è™$šW›a›.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.gcc_except_table.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_pubnames.debug_info.debug_abbrev.debug_line.debug_frame.debug_str.debug_ranges44#HH 1hht7 Ü‚Ü`?<†<7GÿÿÿotŒt lTþÿÿoàŒà €c `` l €€ 0 u°Ž°pÈŽÈp{8‘8¬ äžä‡ŸPPŸP\¬Ÿ¬°§\¡\!(¹„²„" À²"ǘ²˜"Ìœ²œ"ðÕŒ³Œ#Ú³#¤ã4´4$ éX´X$°îX$2÷Š%°:&x ²0èÂ"šóÇ 0aý{ <Ü  I0è iTQ@‘bä0 %; %4HhÜ‚<†tŒàŒ`€ °Ž ÈŽ 8‘ äž ŸPŸ¬Ÿ\¡„²²˜²œ²Œ³³4´X´ !"#$%\‘ ñÿ„²*²8˜²E<´IµU€‘ k¼‘ ñÿwŒ²„”²‘X¡Ÿ˜²«Àž Áñÿ͵Û@´åd›@ ¤› ´› JØœ" ³¼" #O^$ž" óë#'HŸ!c ‰ì›" #œ²ñÿ,ž" ¿¤ÖôŸûž" •¤“h Äi䄲ñÿõ Vak8´x" |žD $Hm<‡¹§X´!Å*ÙIþu,ž" »°Ž Áô " m Ï … `´Œœ —á œ+" : 8‘ A Ô " ë 8œ" € œ ¼ LŸ!ø è‘É  „²ñÿ- 4žH = ðœ+" ôÅ Ñæ T´ñÿò ”U ÷ $ ; ïX Ù€ „²ñÿ‘ Ì›" $4´ /Xœ" „_›äž ¡‡¸H䄲ñÿø˜T@ä " ñT´ñÿø³ñÿµñÿ1<" i­AØÈð„²ñÿ52ŸAø&Šð´´ž " g4´t ˆ=Ÿ„²ñÿµ7򣒫Ւ  call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxuse_wget.cc_ZSt8__ioinitsignature_Z41__static_initialization_and_destruction_0ii__tcf_0_GLOBAL__I__Z12receive_htmlRN7modglue5ipipeE_ZN4sigc8internal10slot_call1INS_16pointer_functor1IRN7modglue5ipipeEbEEbS5_E7call_itEPNS0_8slot_repES5__ZN4sigc8internal10slot_call1INS_16pointer_functor1IRN7modglue11ext_processEbEEbS5_E7call_itEPNS0_8slot_repES5__ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@@GLIBCPP_3.2_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_14slot_do_unbindEEENS_16pointer_functor1IRN7modglue5ipipeEbEEEEvRKT_RKT0__ZN7modglue11ext_processD1Ev_ZN4sigc9trackableD2Ev_ZNSt15basic_streambufIcSt11char_traitsIcEE13_S_pback_sizeE_ZNK7modglue11ext_process9exit_codeEv_ZN4sigc15visit_each_typeIPNS_9trackableENS_8internal12slot_do_bindENS_15adaptor_functorINS_16pointer_functor1IRN7modglue11ext_processEbEEEEEEvRKT0_RKT1__DYNAMIC_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_12slot_do_bindEEENS_16pointer_functor1IRN7modglue5ipipeEbEEEEvRKT_RKT0__ZNSolsEl@@GLIBCPP_3.2_ZNSolsEPFRSoS_E@@GLIBCPP_3.2_fp_hw_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_12slot_do_bindEEENS_16pointer_functor1IRN7modglue11ext_processEbEEEEvRKT_RKT0__Z18receive_exitstatusRN7modglue11ext_processE_ZNSsC1EPKcRKSaIcE@@GLIBCPP_3.2__fini_array_end_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCPP_3.2_ZN7modglue4mainD1Ev__dso_handle_ZN4sigc15visit_each_typeIPNS_9trackableENS_8internal14slot_do_unbindENS_15adaptor_functorINS_16pointer_functor1IRN7modglue11ext_processEbEEEEEEvRKT0_RKT1___libc_csu_fini_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@@GLIBCPP_3.2__cxa_atexit@@GLIBC_2.1.3_ZN7modglue11ext_processC1ERKSs_ZTISt9exception@@GLIBCPP_3.2_ZdlPv@@GLIBCPP_3.2_ZNSt8ios_base4InitC1Ev@@GLIBCPP_3.2_ZN7modglue11ext_processC1ERKS0__ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_14slot_do_unbindEEENS_16pointer_functor1IRN7modglue11ext_processEbEEEEvRKT_RKT0__init_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_14slot_do_unbindEEENS_16pointer_functor1IRN7modglue5ipipeEbEEEEvRKT_RKNS_15adaptor_functorIT0_EE_ZN7modglue4mainC1EiPPc_ZSt4cerr@@GLIBCPP_3.2_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCPP_3.2_ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue5ipipeEbEEE7destroyEPv_start_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_12slot_do_bindEEENS_16pointer_functor1IRN7modglue5ipipeEbEEEEvRKT_RKNS_15adaptor_functorIT0_EE_ZN4sigc15visit_each_typeIPNS_9trackableENS_8internal14slot_do_unbindENS_15adaptor_functorINS_16pointer_functor1IRN7modglue5ipipeEbEEEEEEvRKT0_RKT1___cxa_end_catch@@CXXABI_1.2_ZN7modglue11ext_process4forkEv_ZNSt15basic_streambufIwSt11char_traitsIwEE13_S_pback_sizeE_Z12receive_htmlRN7modglue5ipipeE__fini_array_start__libc_csu_init_ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue11ext_processEbEEE7destroyEPv_ZN7modglue11ext_process11setup_pipesEv__gxx_personality_v0@@CXXABI_1.2__bss_startmain_ZN4sigc9slot_baseC2EPNS_8internal8slot_repE_ZN4sigc9trackableC2Ev__libc_start_main@@GLIBC_2.0_ZN7modglue4main3addEPNS_11ext_processE__init_array_end_ZN4sigc15visit_each_typeIPNS_9trackableENS_8internal12slot_do_bindENS_15adaptor_functorINS_16pointer_functor1IRN7modglue5ipipeEbEEEEEEvRKT0_RKT1_data_start_ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue5ipipeEbEEE3dupEPv_ZN4sigc9slot_baseD2Ev_fini_ZNSolsEm@@GLIBCPP_3.2_ZNSs4_Rep10_M_destroyERKSaIcE@@GLIBCPP_3.2__preinit_array_end_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_12slot_do_bindEEENS_16pointer_functor1IRN7modglue11ext_processEbEEEEvRKT_RKNS_15adaptor_functorIT0_EE_edata_GLOBAL_OFFSET_TABLE__end__cxa_begin_catch@@CXXABI_1.2_ZN4sigc8internal14typed_slot_repINS_16pointer_functor1IRN7modglue11ext_processEbEEE3dupEPv_ZN7modglue11ext_processlsERKSs_ZNK7modglue11ext_process10input_pipeERKSs_Unwind_Resume@@GCC_3.0__init_array_start_ZN4sigc11signal_base7connectERKNS_9slot_baseE_IO_stdin_used_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCPP_3.2_ZNSs20_S_empty_rep_storageE@@GLIBCPP_3.2_ZN4sigc10visit_eachINS_8internal20limit_derived_targetIPNS_9trackableENS1_14slot_do_unbindEEENS_16pointer_functor1IRN7modglue11ext_processEbEEEEvRKT_RKNS_15adaptor_functorIT0_EE__data_start_Jv_RegisterClasses_ZN7modglue4main3runEi__preinit_array_start_ZNSt8ios_base4InitD1Ev@@GLIBCPP_3.2_Znwj@@GLIBCPP_3.2_Z12receive_infoRN7modglue5ipipeE__gmon_start__modglue-1.8/examples/use_wget.cc0000600000077000007700000000224010403767270016341 0ustar kantorkantor #include #include #include bool receive_html(modglue::ipipe& p) { std::string str; while(getline(p,str)) { } p.clear(); return true; } bool receive_info(modglue::ipipe& p) { std::string str; while(getline(p,str)) { } std::cerr << "." << std::flush; p.clear(); return true; } bool receive_exitstatus(modglue::ext_process& pr) { std::cerr << "exit code:" << pr.exit_code() << std::endl; return true; } int main(int argc, char **argv) { modglue::main mm(argc, argv); modglue::ext_process wgett("wget"); wgett << "-O" << "-"; try { modglue::ext_process wget1(wgett); wget1 << "http://www.ictp.trieste.it"; wget1.setup_pipes(); mm.add(&wget1); wget1.input_pipe("stdout")->receiver.connect(sigc::ptr_fun(receive_html)); wget1.input_pipe("stderr")->receiver.connect(sigc::ptr_fun(receive_info)); mm.process_died.connect(sigc::ptr_fun(receive_exitstatus)); wget1.fork(); /* This would be cleaner when written as: wget.set_io(&receive_html,&receive_info); wget.fork(); */ mm.run(1); } catch(std::exception& ex) { std::cerr << ex.what() << std::endl; } } modglue-1.8/include/0000700000077000007700000000000007546524676014034 5ustar kantorkantormodglue-1.8/include/modglue/0000700000077000007700000000000010566301726015451 5ustar kantorkantormodglue-1.8/include/modglue/ext_process.hh0000600000077000007700000000522510404305733020327 0ustar kantorkantor/* $Id: ext_process.hh,v 1.11 2006/03/10 14:23:23 kp229 Exp $ Extended process class (with pipe interface instead of bare file descriptors). Copyright (C) 2001 Kasper Peeters This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef ext_process_hh_ #define ext_process_hh_ #include #include #include namespace modglue { class ext_process /*: public SigC::Object */ { public: ext_process(const std::string&); ext_process(const std::string&, const std::vector&); ext_process(const ext_process& ); // only copies name and arguments ~ext_process(); void setup_pipes(void); ext_process& operator<<(const std::string&); void fork(); void terminate(int exit_code=0); void pause(); void restart(); std::string name(void) const; pid_t get_pid() const; int exit_code() const; const std::vector& args(void) const; const std::vector& input_pipes(void) const; const std::vector& output_pipes(void) const; ipipe* input_pipe(const std::string&) const; opipe* output_pipe(const std::string&) const; const std::vector& output(void) const; // FIXME: remove private: void determine_path_(void); void determine_binary_type_(void); void setup_pipes_from_string_(const std::string& desc); void open_pipes_(void); void dup_unix_pipes_(void); void close_parentside_(void); void close_childside_(void); bool receive_output_(ipipe&); std::string name_; std::vector args_; std::string full_path_; bool modglue_binary_; std::vector input_pipes_; std::vector output_pipes_; pid_t pid_; bool paused_; int exit_code_; bool pipes_done_; std::vector output_; }; }; #endif modglue-1.8/include/modglue/main.hh0000600000077000007700000000623510404305733016717 0ustar kantorkantor/* $Id: main.hh,v 1.20 2006/03/10 14:23:23 kp229 Exp $ Event loop handler Copyright (C) 2001 Kasper Peeters This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef modglue_main_hh_ #define modglue_main_hh_ #include #include #include #include #include #include #include #include #include #include #include #include static volatile char signature[]="MODGLUE_1.0_BINARY"; namespace modglue { class main /* : public SigC::Object */ { public: main(); main(int argc, char **argv); ~main(); void add(ipipe *, int default_fd=-1); // main does not get ownership void add(opipe *, int default_fd=-1); void add(ext_process *); void run(int min_pipes); bool check(void); // When using a non-modglue event loop, the file descriptors on which // to listen for modglue can be obtained through the pipe structures. // The user is responsible for making sure that the select_callback() gets // called when data is available or exceptions occur on one of these pipes. void last_read(void); int fds_to_watch(std::vector& fds) const; bool select_callback(int); // false if connection should be disconnected sigc::signal1 process_died; std::ofstream debugout; private: static int sig_chld_pipe_[2]; // used by sig_chld_ to signal died process // is a copy installed by setup_signal_handlers // int old_sig_chld_pipe_[2]; struct sigaction old_sigaction_chld_; struct sigaction old_sigaction_term_; struct sigaction old_sigaction_int_; bool list_pipes_; std::vector ipipes_; std::vector opipes_; int argc_; char **argv_; std::map pipe_fds_; std::vector processes_; bool terminate_main_loop_; void select_loop_(int min_pipes); std::string build_pipe_list(void) const; void setup_signal_handlers_(void); void restore_signal_handlers_(void); int add_fds_(fd_set& rfds, fd_set& efds, int& maxfd) const; static void sig_chld_(int signo); static void sig_term_(int signo); }; }; #endif modglue-1.8/include/modglue/mid.hh0000600000077000007700000000102410463762140016537 0ustar kantorkantor /* Identifiers for socket messages */ #ifndef mid_hh_ #define mid_hh_ #include #include //#include //#include namespace modglue { class mid { public: mid(void); mid(const mid&); int operator==(const mid&) const; friend std::ostream& operator<<(std::ostream&, const mid&); private: pid_t process_; int serial_; static int highwater_; }; std::ostream& operator<<(std::ostream&, const modglue::mid&); }; #endif modglue-1.8/include/modglue/pipe.hh0000600000077000007700000000632410404305733016727 0ustar kantorkantor /* $Id: pipe.hh,v 1.16 2006/03/10 14:23:23 kp229 Exp $ Pipe class (generalises Unix standard pipes and the pipe() call) Copyright (C) 2001 Kasper Peeters This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef pipe_hh_ #define pipe_hh_ #include #include #include #include namespace modglue { class pipebuf; class ext_process; class pipe { public: virtual ~pipe(); std::string name(void) const; int fd(void) const; int fd_external(void) const; bool is_broken(void) const; // ie. is the other end closed? void open(int fd=-1, int fd_external=-1); void set_unix_style(void); void set_blocking(); void close(void); void close_external(void); void first_read_after_select(); void send_with_ack(const char *, int length); int read_with_ack(char *, int maxlen); ext_process *process; protected: pipe(const std::string& name); virtual void do_fcntl_(void) const=0; int read_nonblocking_(char *data, int maxlen); // returns as 'read' int send_blocking_(const char *data, int len); // returns as 'write' int fd_, fd_external_; bool broken_; bool first_read_after_select_; bool unix_style_pipe_; // uni-directional, no acknowledgement bool make_blocking_; private: std::string name_; }; class pipebuf : public std::streambuf { public: pipebuf(pipe *); ~pipebuf(); void put_buffer(void); void put_char(int); protected: int overflow(int=EOF); int underflow(); int sync(); int flushbuffer(void); private: pipe *pipe_; static const int bufsiz = 1024; static const int putbackarea = 8; char i_buf[bufsiz]; // input buffer; char o_buf[bufsiz]; // output buffer }; class opipe : public pipe, public std::ostream { public: opipe(const std::string& name); private: virtual void do_fcntl_(void) const; }; class ipipe : /* public sigc::object, */ public pipe, public std::istream { public: ipipe(const std::string& name); sigc::signal1 receiver; private: virtual void do_fcntl_(void) const; }; // sockets are always bidirectional... How is this going to fit in? //class server_isocket : public ipipe { // public: //}; // //class server_osocket : public ipipe { // public: //}; // //class client_isocket : public ipipe { // public: //}; // //class client_osocket : public opipe { // public: //}; }; #endif modglue-1.8/include/modglue/process.hh0000600000077000007700000000516710566301726017463 0ustar kantorkantor/* $Id: process.hh,v 1.9 2007/02/19 11:01:16 peekas Exp $ Process class (for forking external processes) Copyright (C) 2001 Kasper Peeters This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef process_hh_ #define process_hh_ #include #include #include #include #include #include //#include //#include namespace modglue { /// A class to start external processes and communicate with them in a blocking /// way. If you need asynchronous communication, use the ext_process class. class child_process { public: child_process(const std::string&); child_process(const std::string&, const std::vector&); ~child_process(); /// Higher-level communication with the external process. void call(const std::string& stdin_txt, std::string& stdout_txt); void call(const std::string& stdin_txt, std::string& stdout_txt, std::string& stderr_txt); void write(const std::string&); void read(std::string&); /// Compatibility functions mimicking Unix read/write. ssize_t read(void *, size_t len); ssize_t write(void *, size_t len); /// Starting and stopping. void fork(); // start the process void terminate(); // terminate the process with kill void close(); // close all pipes void wait(); // wait until process ends pid_t get_pid() const; /// Name and arguments of the child process std::string name; std::vector args; child_process& operator<<(const std::string&); /// Pipe related members void standard_pipes(); class fd_pair { public: enum direction_t { child_output, child_input }; fd_pair(int, direction_t); int child_fd; // better call this `external_fd' int parent_fd; // and this `our_fd' direction_t direction; }; std::vector pipes; private: pid_t pid_; }; }; #endif modglue-1.8/include/modglue/shell.hh0000600000077000007700000000572607337262330017114 0ustar kantorkantor/* $Id: shell.hh,v 1.14 2001/08/17 18:39:20 t16 Exp $ The modglue shell, connecting modglue binaries. Copyright (C) 2001 Kasper Peeters This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef shell_hh_ #define shell_hh_ #include #include #include #include #include #include #include #include #include #include namespace modglue { class process_info { public: process_info(const std::string& name, const std::string& unique_name); modglue::ext_process process; bool start_on_input; bool restart_after_exit; bool abort_on_failed_write; bool remove_after_exit; private: std::string unique_name_; }; class bond { public: bond(const std::string&); typedef std::set >::const_iterator const_iterator; typedef std::set >::iterator iterator; std::string name; std::set > pipes; }; class loader : public SigC::Object { public: loader(modglue::main *, modglue::ipipe *, modglue::opipe *, modglue::opipe *); ~loader(); void quit(void); void print_prompt(void); bool accept_commands(modglue::ipipe& p); bool accept_commands_old(std::istream& p); bool pipe_input(modglue::ipipe& p); void process_died(modglue::ext_process& pr); private: class groupelem { public: string process; string pipe; }; enum status_t { s_initial, s_command, s_skipwhite, s_arg_or_control, s_scan, s_groupscan, s_curlygroup }; std::vector status_; std::vector errors_; std::vector new_processes_; std::string current_; vector current_group_; bool ingroup_; bool parse_(modglue::ipipe& ); void add_bond_(bond *); void remove_bond_(bond *); void print_jobs_(std::ostream& ss); void print_bonds_(std::ostream& ss); main * main_; modglue::ipipe *p_command; modglue::opipe *p_result; modglue::opipe *p_error; std::vector processes_; std::vector bonds_; }; }; #endif modglue-1.8/include/modglue/sock0000600000077000007700000000232710037162704016333 0ustar kantorkantor int sd, newSd, cliLen; struct sockaddr_in cliAddr, servAddr; char line[MAX_MSG]; /* create socket */ sd = socket(AF_INET, SOCK_STREAM, 0); if(sd<0) { perror("cannot open socket "); return ERROR; } /* bind server port */ servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(SERVER_PORT); if(bind(sd, (struct sockaddr *) &servAddr, sizeof(servAddr))<0) { perror("cannot bind port "); return ERROR; } listen(sd,5); while(1) { printf("%s: waiting for data on port TCP %u\n",argv[0],SERVER_PORT); cliLen = sizeof(cliAddr); newSd = accept(sd, (struct sockaddr *) &cliAddr, &cliLen); if(newSd<0) { perror("cannot accept connection "); return ERROR; In order to be notified of incoming connections on a socket, you can use select(2) or poll(2). A readable event will be delivered when a new connection is attempted and you may then call accept to get a socket for that connection. Alternatively, you can set the socket to deliver SIGIO when activity occurs on a socket; see socket(7) for details. How do I handle pipes in main right now? modglue-1.8/INSTALL0000600000077000007700000000026607126135555013434 0ustar kantorkantor To install `modglue', do ./configure make make install as usual. If you want it installed in a different directory than /usr/local, use the --prefix option to configure. modglue-1.8/Makefile.in0000600000077000007700000000135310601745104014433 0ustar kantorkantor export RELEASE=1.8 .PHONY: all install library static examples uninstall clean distclean all: library #examples library: ( cd src && $(MAKE) ); static: ( cd src && $(MAKE) static ); examples: library ( cd examples && $(MAKE) ); install: ( cd src && $(MAKE) install ); install -d -m 755 ${DESTDIR}@prefix@/lib/pkgconfig install -m 644 modglue.pc ${DESTDIR}@prefix@/lib/pkgconfig/ uninstall: ( cd src && $(MAKE) uninstall ); rm -f ${DESTDIR}@prefix@/bin/modglue-config clean: ( cd src && $(MAKE) clean ); ( cd examples && $(MAKE) clean ); rm -f *~ distclean: clean ( cd src && $(MAKE) distclean ); ( cd examples && $(MAKE) distclean ); rm -f Makefile config.cache config.log config.status modglue.pc rm -Rf autom4te.cache modglue-1.8/modglue.pc.in0000600000077000007700000000054510436770021014757 0ustar kantorkantorprefix=@prefix@ exec_prefix=${prefix} # defining another variable in terms of the first libdir=${exec_prefix}/lib includedir=${prefix}/include Name: modglue Description: C++ library for pipes and external processes Version: 1.0.0 URL: http://www.aei.mpg.de/~peekas/modglue Requires: sigc++-2.0 >= 2.0.0 Libs: -L${libdir} -lmodglue Cflags: -I${includedir} modglue-1.8/rpm/0000700000077000007700000000000010605143774013171 5ustar kantorkantormodglue-1.8/rpm/modglue.spec0000600000077000007700000000235210605143774015505 0ustar kantorkantorSummary: C++ library for handling of multiple co-processes Name: modglue Version: 1.8 Release: 1 License: GPL Group: Development/Libraries Source: http://www.aei.mpg.de/~peekas/cadabra/modglue-1.8.tar.gz URL: http://www.aei.mpg.de/~peekas/cadabra Packager: Kasper Peeters BuildRoot: /tmp/modglue-1.8 Prefix: /usr %description Modglue is a C++ library with classes for forking external processes and asynchronous reading from streams. It takes away the burden of all subtleties involving the Unix fork call. The asynchronous read facility enables one to read on multiple input streams at the same time, without loosing any of the standard C++ stream facilities. %prep %setup ./configure --prefix=/usr %build make %files /usr/include/modglue/ext_process.hh /usr/include/modglue/process.hh /usr/include/modglue/pipe.hh /usr/include/modglue/main.hh /usr/bin/ptywrap /usr/bin/prompt /usr/bin/isatty /usr/lib/libmodglue.la /usr/lib/libmid.a /usr/lib/libmid.la /usr/lib/libmid.so /usr/lib/libmid.so.1 /usr/lib/libmid.so.1.0.8 /usr/lib/libmodglue.a /usr/lib/libmodglue.so /usr/lib/libmodglue.so.1 /usr/lib/libmodglue.so.1.0.8 /usr/lib/pkgconfig/modglue.pc %install make DESTDIR="$RPM_BUILD_ROOT" DEVDESTDIR="$RPM_BUILD_ROOT" install modglue-1.8/spkg-install0000644000077000007700000000010410623023006014714 0ustar kantorkantor#!/bin/sh ./configure --prefix="$SAGE_LOCAL" make make install modglue-1.8/src/0000700000077000007700000000000010606653733013164 5ustar kantorkantormodglue-1.8/src/ext_process.cc0000600000077000007700000002340510042223543016021 0ustar kantorkantor #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace modglue; ext_process::ext_process(const std::string& name) : name_(name), modglue_binary_(false), pid_(0), paused_(false), exit_code_(0), pipes_done_(false) { } ext_process::ext_process(const std::string& name, const std::vector& args) : name_(name), args_(args), modglue_binary_(false), pid_(0), paused_(false), exit_code_(0), pipes_done_(false) { } ext_process::ext_process(const ext_process& other) : name_(other.name_), args_(other.args_), modglue_binary_(false), pid_(0), paused_(false), exit_code_(0), pipes_done_(false) { } ext_process::~ext_process() { for(unsigned int i=0; i& ext_process::output() const { return output_; } const std::vector& ext_process::input_pipes() const { return input_pipes_; } const std::vector& ext_process::output_pipes() const { return output_pipes_; } ipipe* ext_process::input_pipe(const std::string& name) const { for(unsigned int i=0; iname()==name) return input_pipes_[i]; } throw std::logic_error("ext_process::input_pipe: pipe "+name+" not known"); } opipe* ext_process::output_pipe(const std::string& name) const { for(unsigned int i=0; iname()==name) return output_pipes_[i]; } throw std::logic_error("ext_process::output_pipe: pipe "+name+" not known"); } ext_process& ext_process::operator<<(const std::string& st) { args_.push_back(st); return (*this); } void ext_process::fork() { assert(pid_==0); if(!pipes_done_) setup_pipes(); open_pipes_(); // std::cerr << "pipes open for " << name_ << std::endl; std::vector realargs=args_; // add '--pipe' arguments for modglue binaries if(modglue_binary_) { for(unsigned int i=0; ifd_external() << std::ends; realargs.push_back(tmp.str()); } for(unsigned int i=0; ifd_external() << std::ends; realargs.push_back(tmp.str()); } } // convert args to something that execvp groks const char *cargs[realargs.size()+2]; cargs[0]=name_.c_str(); for(unsigned int i=0; i(cargs)); throw std::logic_error("modglue::ext_process::fork: execvp failed"); break; default: // we are the parent close_childside_(); break; } } void ext_process::close_childside_(void) { for(unsigned int i=0; iclose_external(); for(unsigned int i=0; iclose_external(); } void ext_process::close_parentside_(void) { for(unsigned int i=0; iclose(); for(unsigned int i=0; iclose(); } void ext_process::terminate(int exit_code) { for(unsigned int i=0; iclose(); for(unsigned int i=0; iclose(); exit_code_=exit_code; if(pid_!=0) { if(kill(pid_, 0)) kill(pid_, SIGTERM); pid_=0; } } void ext_process::pause() { if(pid_!=0 && !paused_) { if(kill(pid_, 0)) kill(pid_, SIGSTOP); paused_=true; } } void ext_process::restart() { if(pid_!=0 && paused_) { if(kill(pid_, 0)) kill(pid_, SIGCONT); paused_=false; } } bool ext_process::receive_output_(ipipe& p) { // std::cerr << "received output" << std::endl; for(unsigned int i=0; iopen(); } for(unsigned int i=0; iopen(); } } void ext_process::dup_unix_pipes_(void) { assert(!modglue_binary_); for(unsigned int i=0; iname()=="stdin") { if(::dup2(output_pipes_[i]->fd_external(), 0)<0) throw std::logic_error("modglue::ext_process::fork: dup2 failed"); ::close(output_pipes_[i]->fd_external()); // is dupped, so no longer needed ::close(output_pipes_[i]->fd()); // parent side } } for(unsigned int i=0; iname()=="stdout") { if(::dup2(input_pipes_[i]->fd_external(), 1)<0) throw std::logic_error("modglue::child_process::fork: dup2 failed"); ::close(input_pipes_[i]->fd_external()); ::close(input_pipes_[i]->fd()); // parent side } else if(input_pipes_[i]->name()=="stderr") { if(::dup2(input_pipes_[i]->fd_external(), 2)<0) throw std::logic_error("modglue::child_process::fork: dup2 failed"); ::close(input_pipes_[i]->fd_external()); ::close(input_pipes_[i]->fd()); // parent side } } } void ext_process::setup_pipes(void) { assert(output_pipes_.size()==0); assert(input_pipes_.size()==0); determine_path_(); determine_binary_type_(); // std::cerr << "path: |" << full_path_ << "|" << std::endl // << "type: " << (modglue_binary_?"modglue":"unix") << std::endl; if(modglue_binary_) { output_pipes_.push_back(new opipe("startup_args")); child_process pr_tst(full_path_); pr_tst.args.push_back("--list-pipes"); std::string result; pr_tst.call("", result); // std::cout << "|" << result << "|" << std::endl; setup_pipes_from_string_(result); if(input_pipes_.size()==0 && output_pipes_.size()==1) throw std::logic_error("moglue::ext_process::setup_pipes: process reports no pipes."); } else { // direction has to be flipped since we are at the other side output_pipes_.push_back(new opipe("startup_args")); output_pipes_.push_back(new opipe("stdin")); input_pipes_.push_back(new ipipe("stdout")); input_pipes_.push_back(new ipipe("stderr")); for(unsigned int i=0; iset_unix_style(); for(unsigned int i=0; iset_unix_style(); } pipes_done_=true; } modglue-1.8/src/gtkiowin.cc0000600000077000007700000000665407244166443015344 0ustar kantorkantor /* Modglue & Gtk-- based program to view traffic on pipes. */ #include #include #include #include #include #include #include #include #include #include #include #include class PipeView : public Gtk::Window { public: PipeView(void); void print(const string& txt); void excprint(const string& txt); void cb_erase(void); void cb_send(void); int delete_event_impl(GdkEventAny *event); private: Gtk::VBox vb1_; Gtk::HBox hb1_; Gtk::ToggleButton tb1_, tb2_; Gtk::Entry out_; Gtk::ScrolledWindow sw_; Gtk::Text monitor_; Gtk::Button but_; Gdk_Color black,white,red; Gdk_Font fixed_font; }; PipeView::PipeView(void) : tb1_("send double lf"), tb2_("strip input lf"), but_("clear") { add(vb1_); vb1_.pack_start(out_,false); vb1_.pack_start(hb1_,false); hb1_.pack_start(tb1_,true); hb1_.pack_start(tb2_,true); vb1_.pack_start(sw_,true); sw_.add(monitor_); monitor_.set_usize(200,300); vb1_.pack_start(but_,false); vb1_.show_all(); red.set_rgb(0xffff,0,0); white.set_rgb(0xffff,0xffff,0xffff); black.set_rgb(0,0,0); monitor_.set_editable(false); but_.clicked.connect(slot(this,&PipeView::cb_erase)); out_.activate.connect(slot(this,&PipeView::cb_send)); } int PipeView::delete_event_impl(GdkEventAny *) { Gtk::Main::quit(); return 0; } void PipeView::cb_erase(void) { monitor_.set_point(0); monitor_.forward_delete(monitor_.get_length()); } void PipeView::print(const string& txt) { string tmp=txt; monitor_.freeze(); if(tb2_.get_active()) if(txt[txt.size()-1]=='\n') tmp=txt.substr(0,txt.size()-1); if(txt[tmp.size()-1]=='\004') tmp=tmp.substr(0,tmp.size()-1)+"\n--EOF--\n"; monitor_.insert(fixed_font, black, white, tmp, -1); monitor_.thaw(); } void PipeView::excprint(const string& txt) { monitor_.freeze(); // cerr << "|" << txt << "| " << txt.size() << endl; monitor_.insert(fixed_font, red, white, txt, -1); monitor_.thaw(); } modglue::pipe *outpipe;; modglue::pipe *foopipe; modglue::pipe *excpipe; map connections; void PipeView::cb_send(void) { try { if(tb1_.get_active()) outpipe->sender(out_.get_text()+"\n\n"); else outpipe->sender(out_.get_text()+"\n"); } catch(exception &ex) { // cerr << "caught writing exception: " << ex.what() << endl; } } void callmm(int fd, GdkInputCondition, modglue::main *mm) { if(!(mm->select_callback(fd))) { connections[fd].disconnect(); } } int main(int argc, char **argv) { modglue::main *mm=new modglue::main(argc, argv); Gtk::Main mymain(&argc, &argv); outpipe =new modglue::pipe("stdout", modglue::pipe::output, 1); foopipe =new modglue::pipe("stdin", modglue::pipe::input, 0); excpipe =new modglue::pipe("stdexc", modglue::pipe::input, 2); mm->add(outpipe); mm->add(foopipe); mm->add(excpipe); if(mm->check()) { PipeView mp; foopipe->receiver.connect(SigC::slot(&mp,&PipeView::print)); excpipe->receiver.connect(SigC::slot(&mp,&PipeView::excprint)); mp.show(); for(unsigned int i=0; ipipes().size(); ++i) { connections[mm->pipes()[i]->get_fd()]=Gtk::Main::input.connect(bind(SigC::slot(&callmm),mm), mm->pipes()[i]->get_fd(), (GdkInputCondition)(GDK_INPUT_READ|GDK_INPUT_EXCEPTION)); } mymain.run(); } } modglue-1.8/src/gtkshell.cc0000600000077000007700000005467007211406070015312 0ustar kantorkantor #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* If we want to eg. use wget to fetch network data, we need some way to make `blocked' data transfer possible such that we know when a certain write has finished. The latter can be faked by requiring a null or something like that at the end for the time being. BETTER: use sendmsg. echo "http://www.somewhere.net" | sed -e 's/\(.*\)/\1 -q -O -/' Also make it possible to write out the data stored in the loader object in a file and reload it at a later stage. */ class ProcessView; modglue::pipe *inforeq; modglue::pipe *infodump; modglue::pipe *fddump; class BondItem : public Gtk::TreeItem { public: BondItem(modglue::Bond *bd, ProcessView *owner); void refresh_subtree(void); // call this when bond_ content changes modglue::Bond *bond_; private: Gtk::Tree pipetree_; ProcessView *owner_; }; class InfoItem : public Gtk::TreeItem { public: InfoItem(modglue::pipeinfo *); modglue::pipeinfo *get_pipeinfo(void) const; private: modglue::pipeinfo *info_; }; class ASpaceItem : public Gtk::TreeItem { public: ASpaceItem(const string& name, ProcessView *owner); private: Gtk::Tree proctree_; std::vector proc_items_; modglue::process *proc_; ProcessView *owner_; }; class ToggleItem : public Gtk::TreeItem { public: ToggleItem(const string& name); Gtk::CheckButton *button(void); void select_impl(void) {} ; private: Gtk::CheckButton *cb_; }; class ProcessItem : public Gtk::TreeItem { public: ProcessItem(const string& name, ProcessView *owner); void activate_subtree(modglue::process *); const vector& info_items(void) const; void update_pipe_subtree(void); modglue::process *get_process(void) const; void toggle_event(Gtk::CheckButton *tb); ToggleItem toggle_start_on_input_; ToggleItem toggle_abort_on_failed_write_; private: Gtk::Tree infotree_; std::vector info_items_; modglue::process *proc_; ProcessView *owner_; ToggleItem toggle_restart_after_exit_; }; class ProcessView : public Gtk::Window { public: ProcessView(int argc, char **argv, modglue::main& mn); ~ProcessView(); void cb_select_child(Gtk::Widget& child,Gtk::Tree *root_tree, Gtk::Tree *subtree); void cb_unselect_child(Gtk::Widget& child,Gtk::Tree *root_tree, Gtk::Tree *subtree); void cb_add_proc(void); void cb_run_proc(void); void cb_kill_proc(void); void cb_connect(void); void cb_generate(void); void cb_hide(void); void cb_remove_bonds(void); int delete_event_impl(GdkEventAny *); void io_callback(int fd, GdkInputCondition); void inforeq_cb(const string&); void popup_window(int fd, GdkInputCondition); bool no_window; private: void setup_tables_(int argc, char **argv); Gtk::ScrolledWindow sw,bsw; Gtk::Tree tr; // for address spaces and processes Gtk::Tree btr; // for bonds Gtk::VBox vb0,vb1,vb2; Gtk::HBox hb0,hb1,hb2,hb3,hb4,hb_misc; Gtk::Label l_newproc, l_newid, l_newaddr; Gtk::Entry e_procname, e_newid, e_addrname; Gtk::Button b_newproc, b_newaddr; Gtk::Button b_kill, b_connect, b_remove, b_run, b_cremove, b_generate, b_hide; std::vector processes_; std::vector bonds_; std::map fdhandlers_; modglue::main &main_; }; ToggleItem::ToggleItem(const string& name) : Gtk::TreeItem(name) { remove(); Gtk::HBox *hb=new Gtk::HBox; add(*(manage(hb))); cb_=new Gtk::CheckButton(); hb->pack_start(*(manage(cb_)),false); hb->pack_start(*(manage(new Gtk::Label(name))),false); show_all(); } Gtk::CheckButton *ToggleItem::button(void) { return cb_; } int ProcessView::delete_event_impl(GdkEventAny *) { modglue::loader::instance().quit(); Gtk::Main::quit(); return 0; } BondItem::BondItem(modglue::Bond *bd, ProcessView *ow) : bond_(bd), owner_(ow), Gtk::TreeItem(bd->name) { } void BondItem::refresh_subtree(void) { set_subtree(pipetree_); modglue::Bond::const_iterator it=bond_->pipes.begin(); while(it!=bond_->pipes.end()) { Gtk::TreeItem *tmp=new Gtk::TreeItem((*it).first->get_name()+":"+ (*it).first->pipes[(*it).second]->get_name()); pipetree_.tree().push_back(*(manage(tmp))); tmp->show_all(); ++it; } } InfoItem::InfoItem(modglue::pipeinfo *inf) : info_(inf), Gtk::TreeItem(" "+inf->get_name()+ ((inf->get_inout()==modglue::pipeinfo::input)?" (input)":" (output)") ) { } modglue::pipeinfo *InfoItem::get_pipeinfo(void) const { return info_; } ProcessItem::ProcessItem(const string& name, ProcessView *owner) : Gtk::TreeItem(name), owner_(owner), toggle_start_on_input_("start on input"), toggle_abort_on_failed_write_("abort on failed write"), toggle_restart_after_exit_("restart after exit") { } void ProcessItem::activate_subtree(modglue::process *proc) { proc_=proc; set_subtree(infotree_); infotree_.select_child.connect(bind(SigC::slot(owner_,&ProcessView::cb_select_child), &infotree_, &infotree_)); infotree_.append(toggle_start_on_input_); infotree_.append(toggle_abort_on_failed_write_); // infotree_.append(toggle_restart_after_exit_); toggle_start_on_input_.show_all(); toggle_abort_on_failed_write_.show_all(); // toggle_restart_after_exit_.show_all(); toggle_start_on_input_.button()->toggled.connect(SigC::bind(SigC::slot(this, &ProcessItem::toggle_event), toggle_start_on_input_.button())); toggle_abort_on_failed_write_.button()->toggled.connect( SigC::bind(SigC::slot(this, &ProcessItem::toggle_event), toggle_abort_on_failed_write_.button())); toggle_restart_after_exit_.button()->toggled.connect(SigC::bind(SigC::slot(this, &ProcessItem::toggle_event), toggle_restart_after_exit_.button())); update_pipe_subtree(); } void ProcessItem::update_pipe_subtree(void) { // This only _adds_, it cannot yet handle removals (but modglue cannot either). for(unsigned int i=info_items_.size(); ipipes.size(); ++i) { info_items_.push_back(new InfoItem(proc_->pipes[i])); infotree_.append(*(info_items_.back())); info_items_.back()->show_all(); } } const vector& ProcessItem::info_items(void) const { return info_items_; } modglue::process *ProcessItem::get_process(void) const { return proc_; } void ProcessItem::toggle_event(Gtk::CheckButton *tb) { bool onoff=tb->get_active(); if(tb==toggle_start_on_input_.button()) proc_->start_on_input=onoff; else if(tb==toggle_abort_on_failed_write_.button()) proc_->abort_on_failed_write=onoff; else proc_->restart_after_exit=onoff; } ProcessView::ProcessView(int argc, char **argv, modglue::main& mn) : no_window(false), l_newproc("program:"), l_newid("unique id:"), b_newproc("new process"), l_newaddr("space name:"), b_newaddr("new address space"), b_kill("kill"), b_connect("connect"), b_remove("remove proc"), b_run("run"), b_cremove("remove bond"), b_generate("generate script"), b_hide("hide"), main_(mn) { add(vb0); vb0.pack_start(hb2, false); // vb0.pack_start(hb3,false); vb0.add(hb0); hb0.pack_start(vb1,true); hb0.pack_start(vb2,true); vb1.pack_start(sw, true); sw.add_with_viewport(tr); vb2.pack_start(bsw,true); bsw.add_with_viewport(btr); tr.select_child.connect(bind(SigC::slot(this,&ProcessView::cb_select_child), &tr, &tr)); tr.unselect_child.connect(bind(SigC::slot(this,&ProcessView::cb_unselect_child), &tr, &tr)); vb1.pack_start(hb1, false); hb1.add(b_connect); hb1.add(b_run); hb1.add(b_kill); hb1.add(b_remove); vb2.pack_start(hb4, false); hb4.add(b_cremove); vb2.pack_start(hb_misc,false); hb_misc.pack_start(b_generate,true); hb_misc.pack_start(b_hide,false); hb2.pack_start(l_newproc,false); hb2.pack_start(e_procname,true); hb2.pack_start(l_newid,false); hb2.pack_start(e_newid,true); hb2.pack_start(b_newproc,false); hb3.pack_start(l_newaddr,false); hb3.pack_start(e_addrname,true); hb3.pack_start(b_newaddr,false); b_newproc.clicked.connect(SigC::slot(this,&ProcessView::cb_add_proc)); e_procname.activate.connect(SigC::slot(this,&ProcessView::cb_add_proc)); e_newid.activate.connect(SigC::slot(this,&ProcessView::cb_add_proc)); b_connect.clicked.connect(SigC::slot(this,&ProcessView::cb_connect)); b_generate.clicked.connect(SigC::slot(this,&ProcessView::cb_generate)); b_run.clicked.connect(SigC::slot(this,&ProcessView::cb_run_proc)); b_kill.clicked.connect(SigC::slot(this,&ProcessView::cb_kill_proc)); b_hide.clicked.connect(SigC::slot(this,&ProcessView::cb_hide)); b_cremove.clicked.connect(SigC::slot(this,&ProcessView::cb_remove_bonds)); vb1.show_all(); b_kill.set_sensitive(false); b_remove.set_sensitive(false); // b_run.set_sensitive(false); tr.set_selection_mode(GTK_SELECTION_MULTIPLE); setup_tables_(argc, argv); } void ProcessView::cb_select_child(Gtk::Widget& child,Gtk::Tree *root_tree, Gtk::Tree *subtree) { Gtk::Tree::SelectionList &selection=tr.selection(); if(selection.empty()) { // b_run.set_sensitive(false); b_remove.set_sensitive(false); b_kill.set_sensitive(false); } else { // b_run.set_sensitive(true); b_remove.set_sensitive(true); b_kill.set_sensitive(true); } } void ProcessView::cb_unselect_child(Gtk::Widget& child,Gtk::Tree *root_tree, Gtk::Tree *subtree) { } void ProcessView::cb_add_proc(void) { ProcessItem *it=new ProcessItem(e_procname.get_text(), this); vector args; modglue::loader::instance().convert_to_args(e_procname.get_text(), args); modglue::process *proc=modglue::loader::instance().load(args); if(e_newid.get_text()!="" && e_newid.get_text()!=e_procname.get_text()) proc->set_id(e_newid.get_text()); for(unsigned int i=0; iget_process()->get_id()==proc->get_id() || processes_[i]->get_process()->get_name()==proc->get_id() ) { cerr << "module with id " << proc->get_id() << " already present" << endl; delete it; // FIXME: remove proc from loader return; } } tr.append(*it); it->activate_subtree(proc); processes_.push_back(it); it->expand(); it->show(); } void ProcessView::cb_run_proc(void) { // first start all processes vector changed; // keep track of which process changed status for(unsigned int k=0; kget_process()->has_sockets()==false) { if(processes_[k]->get_process()->get_pid()==0) { modglue::loader::instance().start(processes_[k]->get_process()); Gtk::Label *pl=dynamic_cast(processes_[k]->get_child()); assert(pl!=0); if(processes_[k]->get_process()->start_on_input) pl->set_text(processes_[k]->get_process()->get_name()+" (standby)"); else pl->set_text(processes_[k]->get_process()->get_name()+" (running)"); changed.push_back(processes_[k]); } } } // then add to the select loop for(unsigned int k=0; kget_process()->pipes.size(); ++i) { if(changed[k]->get_process()->pipes[i]->get_fd()!=-1) { if(changed[k]->get_process()->pipes[i]->get_inout()==modglue::pipeinfo::output) { fdhandlers_[changed[k]->get_process()->pipes[i]->get_fd()]= Gtk::Main::input.connect(slot(this,&ProcessView::io_callback), changed[k]->get_process()->pipes[i]->get_fd(), (GdkInputCondition)(GDK_INPUT_READ)); } // cerr << "adding " << changed[k]->get_process()->pipes[i]->fd() << endl; } } } } void ProcessView::cb_kill_proc(void) { Gtk::Tree::SelectionList &selection=tr.selection(); Gtk::Tree::SelectionList::iterator i=selection.begin(); vector > sels; while(i!=selection.end()) { Gtk::TreeItem *item = (*i); Gtk::Label *label = dynamic_cast(item->get_child()); if(label!=0) { // only if this is a properstupid selections of non-pipe items... string name=label->get(); for(unsigned int k=0; k(processes_[k])==item) { modglue::loader::instance().kill_process(processes_[k]->get_process()); break; } } } ++i; } } void ProcessView::cb_hide(void) { hide_all(); } void ProcessView::cb_remove_bonds(void) { Gtk::Tree::SelectionList &selection=btr.selection(); Gtk::Tree::SelectionList::iterator i=selection.begin(); while(i!=selection.end()) { BondItem *bitem = dynamic_cast(*i); if(bitem) { Gtk::Tree_Helpers::ItemList::iterator ili=btr.tree().begin(); while(ili!=btr.tree().end()) { if((*ili)==bitem) { modglue::loader::instance().remove_bond(bitem->bond_); // FIXME: if processes are running, we have to remove the fd listening // too. This will require the signalling pipe in modglue, otherwise // we end up with races. Perhaps remove_bond() should contain that logic. // FIXME: also remove it from the bonds_ container in processview; (*ili)->hide(); btr.remove_item(**ili); break; } ++ili; } } ++i; } } void ProcessView::io_callback(int fd, GdkInputCondition) { vector proc; vector remfds, addfds; modglue::loader::instance().select_callback(fd, proc, remfds, addfds); for(unsigned int i=0; iget_pid()==0) { if(proc[k]->has_sockets()==false) txt=proc[k]->get_name(); else txt=proc[k]->get_name()+" (standby)"; } else { txt=proc[k]->get_name()+" (running)"; } for(unsigned int i=0; iget_process()==proc[k]) { processes_[i]->update_pipe_subtree(); Gtk::Label *pl=dynamic_cast(processes_[i]->get_child()); assert(pl!=0); pl->set_text(txt); break; } } } } void ProcessView::setup_tables_(int argc, char **argv) { int i=1; string argbit; ProcessItem *current_module_=0; while(i args; modglue::loader::instance().convert_to_args(obj, args); modglue::process *proc=modglue::loader::instance().load(args); current_module_->activate_subtree(proc); // current_module_->expand(); current_module_->show(); } else if(argbit.substr(0,5)=="--id=") { assert(current_module_!=0); current_module_->get_process()->set_id(argbit.substr(5)); } else if(argbit.substr(0,9)=="--options") { if(argbit.substr(10)=="start_on_input") { current_module_->get_process()->start_on_input=true; current_module_->toggle_start_on_input_.button()->set_active(true); } else if(argbit.substr(10)=="abort_on_failed_write") { current_module_->get_process()->abort_on_failed_write=true; current_module_->toggle_abort_on_failed_write_.button()->set_active(true); } } else if(argbit.substr(0,7)=="--bond=") { unsigned int pos=0; string subarg=argbit.substr(6); vector > pps; do { subarg=subarg.substr(pos+1); string argument=subarg.substr(0,subarg.find_first_of(",")); string prog=argument.substr(0,argument.find_first_of(":")); string pip =argument.substr(argument.find_first_of(":")+1); // cerr << prog << "|" << pip << endl; pair tmp; tmp.second=-1; for(unsigned int i=0; iget_process()->get_id()==prog) { tmp.first=processes_[i]->get_process(); for(unsigned int j=0; jpipes.size(); ++j) { // cerr << tmp.first->get_name() << ":" << tmp.first->pipes[j]->get_name() << endl; if(tmp.first->pipes[j]->get_name()==pip) { tmp.second=j; break; } } break; } } if(tmp.first==0) { cerr << "module " << prog << " not declared." << endl; continue; } if(tmp.second==-1) { cerr << "no pipe " << pip << " in module " << prog << endl; continue; } pps.push_back(tmp); } while((pos=subarg.find_first_of(","))pipes.insert(pps[j]); } modglue::loader::instance().add_bond(bd); BondItem *bi=new BondItem(bd, this); bonds_.push_back(bi); btr.tree().push_back(*bi); bi->refresh_subtree(); bi->expand(); bi->show(); } else { // cerr << "unknown argument " << argbit << endl; } ++i; } } void ProcessView::inforeq_cb(const string& inf) { if(inf.substr(0,10)=="list-pipes") { string tmp=main_.build_pipe_list(); infodump->sender(tmp); } else if(inf.substr(0,10)=="list-bonds") { } else if(inf.substr(0,4)=="add ") { infodump->sender("adding "+inf.substr(4)); string obj=inf.substr(4); if(obj[obj.size()-1]=='\n') obj=obj.substr(0,obj.size()-1); ProcessItem *current_module_=new ProcessItem(obj,this); processes_.push_back(current_module_); tr.append(*current_module_); vector args; modglue::loader::instance().convert_to_args(obj, args); modglue::process *proc=modglue::loader::instance().load(args); current_module_->activate_subtree(proc); current_module_->expand(); current_module_->show(); infodump->sender("creating"); vector addfds; modglue::loader::instance().create_forward_pipes(proc, fddump, addfds); for(unsigned int i=0; i > sels; while(i!=selection.end()) { Gtk::TreeItem *item = (*i); Gtk::Label *label = dynamic_cast(item->get_child()); if(label!=0) { // stupid selections of non-pipe items... string name=label->get(); for(unsigned int k=0; k(processes_[k])==item) { // cerr << "main: " << processes_[k] << " " << name << endl; break; } for(unsigned m=0; minfo_items().size(); ++m) { if(processes_[k]->info_items()[m]==item) { sels.push_back(pair(k,m)); // cerr << "pipe: " << processes_[k]->info_items()[m]->get_pipeinfo()->get_name() // << " of process " << processes_[k]->get_process()->get_name() << endl; } } } } ++i; } modglue::Bond *bd=new modglue::Bond("bond"); for(unsigned int j=0; jinfo_items()[sels[j].second]; Gtk::Label *pl=dynamic_cast(inf->get_child()); assert(pl!=0); bd->pipes.insert(pair(processes_[sels[j].first]->get_process(), sels[j].second)); // pl->set_text("C "+inf->get_pipeinfo()->get_name()+ // ((inf->get_pipeinfo()->get_inout()==modglue::pipeinfo::input)?" (input)":" (output)")); } modglue::loader::instance().add_bond(bd); BondItem *bi=new BondItem(bd, this); bonds_.push_back(bi); btr.tree().push_back(*bi); bi->refresh_subtree(); bi->expand(); bi->show(); /* for(unsigned int i=0; ideselect(); ++i; } */ } ProcessView::~ProcessView() { for(unsigned int i=0; iadd(inforeq); mm->add(infodump); mm->add(fddump); if(mm->check()) { ProcessView pv(argc, argv, *mm); pv.set_usize(400,500); if(pv.no_window==false) { pv.show_all(); } inforeq->receiver.connect(SigC::slot(pv,&ProcessView::inforeq_cb)); Gtk::Main::input.connect(slot(pv,&ProcessView::io_callback), modglue::loader::instance().sig_chld_pipe_[0], (GdkInputCondition)(GDK_INPUT_READ|GDK_INPUT_EXCEPTION)); if(inforeq->get_fd()!=-1) { Gtk::Main::input.connect(slot(pv,&ProcessView::io_callback), inforeq->get_fd(), (GdkInputCondition)(GDK_INPUT_READ|GDK_INPUT_EXCEPTION)); } // quick trick to allow us to pop up a window by sending something to stdin; should // be replaced with a handler that listens to SIGHUP or something like that. Gtk::Main::input.connect(slot(pv,&ProcessView::popup_window), 0, (GdkInputCondition)(GDK_INPUT_READ|GDK_INPUT_EXCEPTION)); try { if(pv.no_window) pv.cb_run_proc(); mymain.run(); } catch(exception &ex) { cerr << "[exception]: " << ex.what() << endl; } } } modglue-1.8/src/gtkshell2.cc0000600000077000007700000005470607211406071015375 0ustar kantorkantor #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* If we want to eg. use wget to fetch network data, we need some way to make `blocked' data transfer possible such that we know when a certain write has finished. The latter can be faked by requiring a null or something like that at the end for the time being. BETTER: use sendmsg. echo "http://www.somewhere.net" | sed -e 's/\(.*\)/\1 -q -O -/' Also make it possible to write out the data stored in the loader object in a file and reload it at a later stage. */ class ProcessView; modglue::pipe *inforeq; modglue::pipe *infodump; modglue::pipe *fddump; class BondItem : public Gtk::TreeItem { public: BondItem(modglue::Bond *bd, ProcessView *owner); void refresh_subtree(void); // call this when bond_ content changes // modglue::Bond *bond_; private: Gtk::Tree pipetree_; ProcessView *owner_; }; class InfoItem : public Gtk::TreeItem { public: InfoItem(modglue::pipeinfo *); // modglue::pipeinfo *get_pipeinfo(void) const; private: // modglue::pipeinfo *info_; }; class ASpaceItem : public Gtk::TreeItem { public: ASpaceItem(const string& name, ProcessView *owner); private: Gtk::Tree proctree_; std::vector proc_items_; // modglue::process *proc_; ProcessView *owner_; }; class ToggleItem : public Gtk::TreeItem { public: ToggleItem(const string& name); Gtk::CheckButton *button(void); void select_impl(void) {} ; private: Gtk::CheckButton *cb_; }; class ProcessItem : public Gtk::TreeItem { public: ProcessItem(const string& name, ProcessView *owner); void activate_subtree(modglue::process *); const vector& info_items(void) const; void update_pipe_subtree(void); // modglue::process *get_process(void) const; void toggle_event(Gtk::CheckButton *tb); ToggleItem toggle_start_on_input_; ToggleItem toggle_abort_on_failed_write_; private: Gtk::Tree infotree_; std::vector info_items_; // modglue::process *proc_; ProcessView *owner_; ToggleItem toggle_restart_after_exit_; }; class ProcessView : public Gtk::Window { public: ProcessView(int argc, char **argv, modglue::main& mn); ~ProcessView(); void cb_select_child(Gtk::Widget& child,Gtk::Tree *root_tree, Gtk::Tree *subtree); void cb_unselect_child(Gtk::Widget& child,Gtk::Tree *root_tree, Gtk::Tree *subtree); void cb_add_proc(void); void cb_run_proc(void); void cb_kill_proc(void); void cb_connect(void); void cb_generate(void); void cb_hide(void); void cb_remove_bonds(void); int delete_event_impl(GdkEventAny *); void io_callback(int fd, GdkInputCondition); void inforeq_cb(const string&); void popup_window(int fd, GdkInputCondition); bool no_window; private: void setup_tables_(int argc, char **argv); Gtk::ScrolledWindow sw,bsw; Gtk::Tree tr; // for address spaces and processes Gtk::Tree btr; // for bonds Gtk::VBox vb0,vb1,vb2; Gtk::HBox hb0,hb1,hb2,hb3,hb4,hb_misc; Gtk::Label l_newproc, l_newid, l_newaddr; Gtk::Entry e_procname, e_newid, e_addrname; Gtk::Button b_newproc, b_newaddr; Gtk::Button b_kill, b_connect, b_remove, b_run, b_cremove, b_generate, b_hide; std::vector processes_; std::vector bonds_; std::map fdhandlers_; // modglue::main &main_; }; ToggleItem::ToggleItem(const string& name) : Gtk::TreeItem(name) { remove(); Gtk::HBox *hb=new Gtk::HBox; add(*(manage(hb))); cb_=new Gtk::CheckButton(); hb->pack_start(*(manage(cb_)),false); hb->pack_start(*(manage(new Gtk::Label(name))),false); show_all(); } Gtk::CheckButton *ToggleItem::button(void) { return cb_; } int ProcessView::delete_event_impl(GdkEventAny *) { modglue::loader::instance().quit(); Gtk::Main::quit(); return 0; } BondItem::BondItem(modglue::Bond *bd, ProcessView *ow) : bond_(bd), owner_(ow), Gtk::TreeItem(bd->name) { } void BondItem::refresh_subtree(void) { set_subtree(pipetree_); modglue::Bond::const_iterator it=bond_->pipes.begin(); while(it!=bond_->pipes.end()) { Gtk::TreeItem *tmp=new Gtk::TreeItem((*it).first->get_name()+":"+ (*it).first->pipes[(*it).second]->get_name()); pipetree_.tree().push_back(*(manage(tmp))); tmp->show_all(); ++it; } } InfoItem::InfoItem(modglue::pipeinfo *inf) : info_(inf), Gtk::TreeItem(" "+inf->get_name()+ ((inf->get_inout()==modglue::pipeinfo::input)?" (input)":" (output)") ) { } modglue::pipeinfo *InfoItem::get_pipeinfo(void) const { return info_; } ProcessItem::ProcessItem(const string& name, ProcessView *owner) : Gtk::TreeItem(name), owner_(owner), toggle_start_on_input_("start on input"), toggle_abort_on_failed_write_("abort on failed write"), toggle_restart_after_exit_("restart after exit") { } void ProcessItem::activate_subtree(modglue::process *proc) { proc_=proc; set_subtree(infotree_); infotree_.select_child.connect(bind(SigC::slot(owner_,&ProcessView::cb_select_child), &infotree_, &infotree_)); infotree_.append(toggle_start_on_input_); infotree_.append(toggle_abort_on_failed_write_); // infotree_.append(toggle_restart_after_exit_); toggle_start_on_input_.show_all(); toggle_abort_on_failed_write_.show_all(); // toggle_restart_after_exit_.show_all(); toggle_start_on_input_.button()->toggled.connect(SigC::bind(SigC::slot(this, &ProcessItem::toggle_event), toggle_start_on_input_.button())); toggle_abort_on_failed_write_.button()->toggled.connect( SigC::bind(SigC::slot(this, &ProcessItem::toggle_event), toggle_abort_on_failed_write_.button())); toggle_restart_after_exit_.button()->toggled.connect(SigC::bind(SigC::slot(this, &ProcessItem::toggle_event), toggle_restart_after_exit_.button())); update_pipe_subtree(); } void ProcessItem::update_pipe_subtree(void) { // This only _adds_, it cannot yet handle removals (but modglue cannot either). for(unsigned int i=info_items_.size(); ipipes.size(); ++i) { info_items_.push_back(new InfoItem(proc_->pipes[i])); infotree_.append(*(info_items_.back())); info_items_.back()->show_all(); } } const vector& ProcessItem::info_items(void) const { return info_items_; } modglue::process *ProcessItem::get_process(void) const { return proc_; } void ProcessItem::toggle_event(Gtk::CheckButton *tb) { bool onoff=tb->get_active(); if(tb==toggle_start_on_input_.button()) proc_->start_on_input=onoff; else if(tb==toggle_abort_on_failed_write_.button()) proc_->abort_on_failed_write=onoff; else proc_->restart_after_exit=onoff; } ProcessView::ProcessView(int argc, char **argv, modglue::main& mn) : no_window(false), l_newproc("program:"), l_newid("unique id:"), b_newproc("new process"), l_newaddr("space name:"), b_newaddr("new address space"), b_kill("kill"), b_connect("connect"), b_remove("remove proc"), b_run("run"), b_cremove("remove bond"), b_generate("generate script"), b_hide("hide"), main_(mn) { add(vb0); vb0.pack_start(hb2, false); // vb0.pack_start(hb3,false); vb0.add(hb0); hb0.pack_start(vb1,true); hb0.pack_start(vb2,true); vb1.pack_start(sw, true); sw.add_with_viewport(tr); vb2.pack_start(bsw,true); bsw.add_with_viewport(btr); tr.select_child.connect(bind(SigC::slot(this,&ProcessView::cb_select_child), &tr, &tr)); tr.unselect_child.connect(bind(SigC::slot(this,&ProcessView::cb_unselect_child), &tr, &tr)); vb1.pack_start(hb1, false); hb1.add(b_connect); hb1.add(b_run); hb1.add(b_kill); hb1.add(b_remove); vb2.pack_start(hb4, false); hb4.add(b_cremove); vb2.pack_start(hb_misc,false); hb_misc.pack_start(b_generate,true); hb_misc.pack_start(b_hide,false); hb2.pack_start(l_newproc,false); hb2.pack_start(e_procname,true); hb2.pack_start(l_newid,false); hb2.pack_start(e_newid,true); hb2.pack_start(b_newproc,false); hb3.pack_start(l_newaddr,false); hb3.pack_start(e_addrname,true); hb3.pack_start(b_newaddr,false); b_newproc.clicked.connect(SigC::slot(this,&ProcessView::cb_add_proc)); e_procname.activate.connect(SigC::slot(this,&ProcessView::cb_add_proc)); e_newid.activate.connect(SigC::slot(this,&ProcessView::cb_add_proc)); b_connect.clicked.connect(SigC::slot(this,&ProcessView::cb_connect)); b_generate.clicked.connect(SigC::slot(this,&ProcessView::cb_generate)); b_run.clicked.connect(SigC::slot(this,&ProcessView::cb_run_proc)); b_kill.clicked.connect(SigC::slot(this,&ProcessView::cb_kill_proc)); b_hide.clicked.connect(SigC::slot(this,&ProcessView::cb_hide)); b_cremove.clicked.connect(SigC::slot(this,&ProcessView::cb_remove_bonds)); vb1.show_all(); b_kill.set_sensitive(false); b_remove.set_sensitive(false); // b_run.set_sensitive(false); tr.set_selection_mode(GTK_SELECTION_MULTIPLE); setup_tables_(argc, argv); } void ProcessView::cb_select_child(Gtk::Widget& child,Gtk::Tree *root_tree, Gtk::Tree *subtree) { Gtk::Tree::SelectionList &selection=tr.selection(); if(selection.empty()) { // b_run.set_sensitive(false); b_remove.set_sensitive(false); b_kill.set_sensitive(false); } else { // b_run.set_sensitive(true); b_remove.set_sensitive(true); b_kill.set_sensitive(true); } } void ProcessView::cb_unselect_child(Gtk::Widget& child,Gtk::Tree *root_tree, Gtk::Tree *subtree) { } void ProcessView::cb_add_proc(void) { ProcessItem *it=new ProcessItem(e_procname.get_text(), this); vector args; modglue::loader::instance().convert_to_args(e_procname.get_text(), args); modglue::process *proc=modglue::loader::instance().load(args); if(e_newid.get_text()!="" && e_newid.get_text()!=e_procname.get_text()) proc->set_id(e_newid.get_text()); for(unsigned int i=0; iget_process()->get_id()==proc->get_id() || processes_[i]->get_process()->get_name()==proc->get_id() ) { cerr << "module with id " << proc->get_id() << " already present" << endl; delete it; // FIXME: remove proc from loader return; } } tr.append(*it); it->activate_subtree(proc); processes_.push_back(it); it->expand(); it->show(); } void ProcessView::cb_run_proc(void) { // first start all processes vector changed; // keep track of which process changed status for(unsigned int k=0; kget_process()->has_sockets()==false) { if(processes_[k]->get_process()->get_pid()==0) { modglue::loader::instance().start(processes_[k]->get_process()); Gtk::Label *pl=dynamic_cast(processes_[k]->get_child()); assert(pl!=0); if(processes_[k]->get_process()->start_on_input) pl->set_text(processes_[k]->get_process()->get_name()+" (standby)"); else pl->set_text(processes_[k]->get_process()->get_name()+" (running)"); changed.push_back(processes_[k]); } } } // then add to the select loop for(unsigned int k=0; kget_process()->pipes.size(); ++i) { if(changed[k]->get_process()->pipes[i]->get_fd()!=-1) { if(changed[k]->get_process()->pipes[i]->get_inout()==modglue::pipeinfo::output) { fdhandlers_[changed[k]->get_process()->pipes[i]->get_fd()]= Gtk::Main::input.connect(slot(this,&ProcessView::io_callback), changed[k]->get_process()->pipes[i]->get_fd(), (GdkInputCondition)(GDK_INPUT_READ)); } // cerr << "adding " << changed[k]->get_process()->pipes[i]->fd() << endl; } } } } void ProcessView::cb_kill_proc(void) { Gtk::Tree::SelectionList &selection=tr.selection(); Gtk::Tree::SelectionList::iterator i=selection.begin(); vector > sels; while(i!=selection.end()) { Gtk::TreeItem *item = (*i); Gtk::Label *label = dynamic_cast(item->get_child()); if(label!=0) { // only if this is a properstupid selections of non-pipe items... string name=label->get(); for(unsigned int k=0; k(processes_[k])==item) { modglue::loader::instance().kill_process(processes_[k]->get_process()); break; } } } ++i; } } void ProcessView::cb_hide(void) { hide_all(); } void ProcessView::cb_remove_bonds(void) { Gtk::Tree::SelectionList &selection=btr.selection(); Gtk::Tree::SelectionList::iterator i=selection.begin(); while(i!=selection.end()) { BondItem *bitem = dynamic_cast(*i); if(bitem) { Gtk::Tree_Helpers::ItemList::iterator ili=btr.tree().begin(); while(ili!=btr.tree().end()) { if((*ili)==bitem) { modglue::loader::instance().remove_bond(bitem->bond_); // FIXME: if processes are running, we have to remove the fd listening // too. This will require the signalling pipe in modglue, otherwise // we end up with races. Perhaps remove_bond() should contain that logic. // FIXME: also remove it from the bonds_ container in processview; (*ili)->hide(); btr.remove_item(**ili); break; } ++ili; } } ++i; } } void ProcessView::io_callback(int fd, GdkInputCondition) { vector proc; vector remfds, addfds; modglue::loader::instance().select_callback(fd, proc, remfds, addfds); for(unsigned int i=0; iget_pid()==0) { if(proc[k]->has_sockets()==false) txt=proc[k]->get_name(); else txt=proc[k]->get_name()+" (standby)"; } else { txt=proc[k]->get_name()+" (running)"; } for(unsigned int i=0; iget_process()==proc[k]) { processes_[i]->update_pipe_subtree(); Gtk::Label *pl=dynamic_cast(processes_[i]->get_child()); assert(pl!=0); pl->set_text(txt); break; } } } } void ProcessView::setup_tables_(int argc, char **argv) { int i=1; string argbit; ProcessItem *current_module_=0; while(i args; modglue::loader::instance().convert_to_args(obj, args); modglue::process *proc=modglue::loader::instance().load(args); current_module_->activate_subtree(proc); // current_module_->expand(); current_module_->show(); } else if(argbit.substr(0,5)=="--id=") { assert(current_module_!=0); current_module_->get_process()->set_id(argbit.substr(5)); } else if(argbit.substr(0,9)=="--options") { if(argbit.substr(10)=="start_on_input") { current_module_->get_process()->start_on_input=true; current_module_->toggle_start_on_input_.button()->set_active(true); } else if(argbit.substr(10)=="abort_on_failed_write") { current_module_->get_process()->abort_on_failed_write=true; current_module_->toggle_abort_on_failed_write_.button()->set_active(true); } } else if(argbit.substr(0,7)=="--bond=") { unsigned int pos=0; string subarg=argbit.substr(6); vector > pps; do { subarg=subarg.substr(pos+1); string argument=subarg.substr(0,subarg.find_first_of(",")); string prog=argument.substr(0,argument.find_first_of(":")); string pip =argument.substr(argument.find_first_of(":")+1); // cerr << prog << "|" << pip << endl; pair tmp; tmp.second=-1; for(unsigned int i=0; iget_process()->get_id()==prog) { tmp.first=processes_[i]->get_process(); for(unsigned int j=0; jpipes.size(); ++j) { // cerr << tmp.first->get_name() << ":" << tmp.first->pipes[j]->get_name() << endl; if(tmp.first->pipes[j]->get_name()==pip) { tmp.second=j; break; } } break; } } if(tmp.first==0) { cerr << "module " << prog << " not declared." << endl; continue; } if(tmp.second==-1) { cerr << "no pipe " << pip << " in module " << prog << endl; continue; } pps.push_back(tmp); } while((pos=subarg.find_first_of(","))pipes.insert(pps[j]); } modglue::loader::instance().add_bond(bd); BondItem *bi=new BondItem(bd, this); bonds_.push_back(bi); btr.tree().push_back(*bi); bi->refresh_subtree(); bi->expand(); bi->show(); } else { // cerr << "unknown argument " << argbit << endl; } ++i; } } void ProcessView::inforeq_cb(const string& inf) { if(inf.substr(0,10)=="list-pipes") { string tmp=main_.build_pipe_list(); infodump->sender(tmp); } else if(inf.substr(0,10)=="list-bonds") { } else if(inf.substr(0,4)=="add ") { infodump->sender("adding "+inf.substr(4)); string obj=inf.substr(4); if(obj[obj.size()-1]=='\n') obj=obj.substr(0,obj.size()-1); ProcessItem *current_module_=new ProcessItem(obj,this); processes_.push_back(current_module_); tr.append(*current_module_); vector args; modglue::loader::instance().convert_to_args(obj, args); modglue::process *proc=modglue::loader::instance().load(args); current_module_->activate_subtree(proc); current_module_->expand(); current_module_->show(); infodump->sender("creating"); vector addfds; modglue::loader::instance().create_forward_pipes(proc, fddump, addfds); for(unsigned int i=0; i > sels; while(i!=selection.end()) { Gtk::TreeItem *item = (*i); Gtk::Label *label = dynamic_cast(item->get_child()); if(label!=0) { // stupid selections of non-pipe items... string name=label->get(); for(unsigned int k=0; k(processes_[k])==item) { // cerr << "main: " << processes_[k] << " " << name << endl; break; } for(unsigned m=0; minfo_items().size(); ++m) { if(processes_[k]->info_items()[m]==item) { sels.push_back(pair(k,m)); // cerr << "pipe: " << processes_[k]->info_items()[m]->get_pipeinfo()->get_name() // << " of process " << processes_[k]->get_process()->get_name() << endl; } } } } ++i; } modglue::Bond *bd=new modglue::Bond("bond"); for(unsigned int j=0; jinfo_items()[sels[j].second]; Gtk::Label *pl=dynamic_cast(inf->get_child()); assert(pl!=0); bd->pipes.insert(pair(processes_[sels[j].first]->get_process(), sels[j].second)); // pl->set_text("C "+inf->get_pipeinfo()->get_name()+ // ((inf->get_pipeinfo()->get_inout()==modglue::pipeinfo::input)?" (input)":" (output)")); } modglue::loader::instance().add_bond(bd); BondItem *bi=new BondItem(bd, this); bonds_.push_back(bi); btr.tree().push_back(*bi); bi->refresh_subtree(); bi->expand(); bi->show(); /* for(unsigned int i=0; ideselect(); ++i; } */ } ProcessView::~ProcessView() { for(unsigned int i=0; iadd(inforeq); mm->add(infodump); mm->add(fddump); if(mm->check()) { ProcessView pv(argc, argv, *mm); pv.set_usize(400,500); if(pv.no_window==false) { pv.show_all(); } inforeq->receiver.connect(SigC::slot(pv,&ProcessView::inforeq_cb)); Gtk::Main::input.connect(slot(pv,&ProcessView::io_callback), modglue::loader::instance().sig_chld_pipe_[0], (GdkInputCondition)(GDK_INPUT_READ|GDK_INPUT_EXCEPTION)); if(inforeq->get_fd()!=-1) { Gtk::Main::input.connect(slot(pv,&ProcessView::io_callback), inforeq->get_fd(), (GdkInputCondition)(GDK_INPUT_READ|GDK_INPUT_EXCEPTION)); } // quick trick to allow us to pop up a window by sending something to stdin; should // be replaced with a handler that listens to SIGHUP or something like that. Gtk::Main::input.connect(slot(pv,&ProcessView::popup_window), 0, (GdkInputCondition)(GDK_INPUT_READ|GDK_INPUT_EXCEPTION)); try { if(pv.no_window) pv.cb_run_proc(); mymain.run(); } catch(exception &ex) { cerr << "[exception]: " << ex.what() << endl; } } } modglue-1.8/src/isatty.cc0000600000077000007700000000053407533674347015025 0ustar kantorkantor #include #include int main(int argc, char **argv) { std::cout << ((isatty(0)==1)?"stdin is a tty":"stdin is NOT a tty") << std::endl; std::cout << ((isatty(1)==1)?"stdout is a tty":"stdout is NOT a tty") << std::endl; std::cout << ((isatty(2)==1)?"stderr is a tty":"stderr is NOT a tty") << std::endl; return(2); } modglue-1.8/src/load0000600000077000007700000000020207156135626014024 0ustar kantorkantor#!/bin/sh # # This script will eventually be replaced with something that does # not rely on gtkshell. # gtkshell \ --module=$1 modglue-1.8/src/loader.cc0000600000077000007700000000041607153731454014744 0ustar kantorkantor #include #include #include #include #include void build_module_table(int argc, char **argv) { } main(int argc, char **argv) { build_module_table(argc, argv); modglue::loader::instance().run(); } modglue-1.8/src/main.cc0000600000077000007700000002476410566301726014433 0ustar kantorkantor #include #include #include #include #include #include #include #include #include #include #include #include using namespace modglue; int modglue::main::sig_chld_pipe_[2]; modglue::main *themm; void main::setup_signal_handlers_(void) { themm=this; if(::pipe(sig_chld_pipe_)) { throw std::logic_error("cannot create sig_chld_pipe"); } fcntl(sig_chld_pipe_[0], F_SETFL, O_NONBLOCK); struct sigaction act; act.sa_handler = &main::sig_chld_; sigemptyset(&act.sa_mask); act.sa_flags = SA_NOCLDSTOP | SA_RESTART; if(sigaction(SIGCHLD, &act, &old_sigaction_chld_) < 0) { throw std::logic_error("sigaction failed"); } act.sa_handler = &main::sig_term_; sigemptyset(&act.sa_mask); if(sigaction(SIGTERM, &act, &old_sigaction_term_) < 0) { throw std::logic_error("sigaction failed"); } // When we are in the middle of a write subroutine and the process // to which we write terminates, we catch the SIG_CLD signal but // we cannot react to that before a certain sync point. If we happen // to write to the sockets, we get a SIGPIPE. Since we handle pipe // closing afterwards, everything will be fine if we ignore this // signal. signal(SIGPIPE, SIG_IGN); } void main::restore_signal_handlers_(void) { close(sig_chld_pipe_[0]); close(sig_chld_pipe_[1]); sigaction(SIGCHLD, &old_sigaction_chld_, NULL); sigaction(SIGTERM, &old_sigaction_term_, NULL); } void main::sig_chld_(int signo) { int status; pid_t childpid; // std::cerr << "*****" << std::endl; char buffer[100]; if((childpid=waitpid(-1, &status, WNOHANG)) < 0) { if(errno==ECHILD) // No more children left, return immediately. return; else { sprintf(buffer, "waitpid failed, errno = %d", errno); throw std::logic_error(buffer); } } if(WIFEXITED(status)) { // std::cerr << "***** exited" << std::endl; int child_val = WEXITSTATUS(status); sprintf(buffer, "%ld %d", (long)childpid, child_val); write(main::sig_chld_pipe_[1], buffer, strlen(buffer)); } else if(WIFSIGNALED(status)) { // std::cerr << "***** signalled" << std::endl; sprintf(buffer, "%ld", (long)childpid); write(main::sig_chld_pipe_[1], buffer, strlen(buffer)); } } void main::sig_term_(int signo) { // This does of course not catch SIGKILL, that will still leave // process adopted by init. But there is no way around that, apparently. write(main::sig_chld_pipe_[1], "T", 1); } //----------------- main::main(void) : list_pipes_(false), argc_(0), argv_(0), terminate_main_loop_(false) { setup_signal_handlers_(); } main::main(int argc, char **argv) : list_pipes_(false), argc_(argc), argv_(argv), terminate_main_loop_(false) { setup_signal_handlers_(); int ac=1; while(acfd()==-1) { std::map::const_iterator it=pipe_fds_.find(p->name()); if(it==pipe_fds_.end()) { if(p->name()=="stdin") { throw std::logic_error("pipe name stdin and type output incompatible"); } else if(p->name()=="stdout") { p->open(1); p->set_unix_style(); } else if(p->name()=="stderr") { p->open(2); p->set_unix_style(); } else if(default_fd!=-1) { p->open(default_fd); p->set_unix_style(); } } else p->open((*it).second); } } void main::add(ipipe *p, int default_fd) { ipipes_.push_back(p); if(p->fd()==-1) { std::map::const_iterator it=pipe_fds_.find(p->name()); if(it==pipe_fds_.end()) { if(p->name()=="stdin") { p->open(0); p->set_unix_style(); } else if(p->name()=="stdout") { throw std::logic_error("pipe name stdout and type input incompatible"); } else if(p->name()=="stderr") { throw std::logic_error("pipe name stdout and type input incompatible"); } else if(default_fd!=-1) { p->open(default_fd); p->set_unix_style(); } } else p->open((*it).second); } } void main::add(ext_process *proc) { processes_.push_back(proc); for(unsigned int i=0; iinput_pipes().size(); ++i) { proc->input_pipes()[i]->process=proc; } for(unsigned int i=0; ioutput_pipes().size(); ++i) { proc->output_pipes()[i]->process=proc; } } main::~main() { // FIXME: should we terminate all processes? Not sure, we do // not own them after all. restore_signal_handlers_(); } void main::run(int min_pipes) { if(check()) select_loop_(min_pipes); } std::string main::build_pipe_list(void) const { std::stringstream str; for(unsigned int i=0; iname() << "\" , " << "input" << " }" << std::endl; } for(unsigned int i=0; iname() << "\" , " << "output" << " }" << std::endl; } str << std::ends; return str.str(); } bool main::check(void) { if(list_pipes_) { std::cout << build_pipe_list() << std::flush; return false; } else return true; } void main::last_read(void) { for(unsigned int i=0; iis_broken()==false) { ipipes_[i]->first_read_after_select(); ipipes_[i]->receiver(*(ipipes_[i])); } } for(unsigned int i=0; iinput_pipes().size(); ++k) { if(processes_[i]->input_pipes()[k]->is_broken()==false) { processes_[i]->input_pipes()[k]->first_read_after_select(); processes_[i]->input_pipes()[k]->receiver(*(processes_[i]->input_pipes()[k])); } } } } bool main::select_callback(int fd) { // debugout << "sc: " << fd << std::endl; if(fd==sig_chld_pipe_[0]) { // std::cerr << "sig_chld_pipe" << std::endl; char buffer[1024]; int pos=-1; do { pos=read(fd,buffer,1023-1); } while(pos<0 && (errno==EINTR || errno==EAGAIN)); if(pos>0) { // std::cerr << "sig_chld_pipe " << buffer[0] << std::endl; if(buffer[0]=='T') { for(unsigned int i=0; iterminate(); } exit(-1); } else { buffer[pos]=0; pid_t childpid=0; int exit_code=0; // std::cerr << buffer << std::endl; sscanf(buffer, "%ld %d", &childpid, &exit_code); // This often gets reached after cerr has gone away. Why? for(unsigned int i=0; iget_pid() << std::endl; if(processes_[i]->get_pid()==childpid) { // std::cerr << "process " << processes_[i]->name() << " exited" << std::endl; // process all unprocessed data from this process for(unsigned int lp=0; lpinput_pipes().size(); ++lp) { processes_[i]->input_pipes()[lp]->receiver(*(processes_[i]->input_pipes()[lp])); } processes_[i]->terminate(exit_code); if(process_died(*(processes_[i]))) terminate_main_loop_=true; break; } } } } else { throw std::logic_error("main::select_callback: read failed"); } return true; } for(unsigned int i=0; iis_broken()==false && ipipes_[i]->fd()==fd) { ipipes_[i]->first_read_after_select(); return ipipes_[i]->receiver(*(ipipes_[i])); } } for(unsigned int i=0; iinput_pipes().size(); ++k) { if(processes_[i]->input_pipes()[k]->is_broken()==false && processes_[i]->input_pipes()[k]->fd()==fd) { processes_[i]->input_pipes()[k]->first_read_after_select(); processes_[i]->input_pipes()[k]->receiver(*(processes_[i]->input_pipes()[k])); return true; } } } // Unknown fd, happens sometimes when processes end and a last // select woke up on an already closed pipe. Should figure out // whether this is an exception. return false; } int main::fds_to_watch(std::vector& fds) const { int maxfd=0; // control pipe maxfd=std::max(maxfd, sig_chld_pipe_[0]); // separate pipes for(unsigned int i=0; iis_broken()==false) if(ipipes_[i]->fd()!=-1) { fds.push_back(ipipes_[i]->fd()); maxfd=std::max(maxfd, ipipes_[i]->fd()); } } // pipes associated to processes for(unsigned int i=0; iinput_pipes().size(); ++k) { if(processes_[i]->input_pipes()[k]->is_broken()) { at_least_one_broken=true; break; } } if(!at_least_one_broken) { for(unsigned int k=0; kinput_pipes().size(); ++k) { fds.push_back(processes_[i]->input_pipes()[k]->fd()); maxfd=std::max(maxfd, processes_[i]->input_pipes()[k]->fd()); } } } fds.push_back(sig_chld_pipe_[0]); // std::cerr << fds.size() << std::endl; return maxfd; } int main::add_fds_(fd_set& rfds, fd_set& efds, int& maxfd) const { FD_ZERO(&rfds); FD_ZERO(&efds); std::vector fds; maxfd=fds_to_watch(fds); for(unsigned int i=0; i #include #include using namespace modglue; int mid::highwater_=0; mid::mid(void) { process_=getpid(); ++highwater_; serial_=highwater_; } mid::mid(const mid& other) { serial_=other.serial_; process_=other.process_; } int mid::operator==(const mid& other) const { return (process_==other.process_ && serial_==other.serial_); } std::ostream& modglue::operator<<(std::ostream& str, const modglue::mid & m) { return (str << "mid=" << m.process_ << ", " << m.serial_); } modglue-1.8/src/modshell.cc0000600000077000007700000000124407336317024015301 0ustar kantorkantor #include #include #include int main(int argc, char **argv) { modglue::main mm(argc, argv); modglue::ipipe p_command("stdin"); modglue::opipe p_result("stdout"); modglue::opipe p_error("stderr"); mm.add(&p_command,0); mm.add(&p_result,1); mm.add(&p_error,2); if(mm.check()) { modglue::loader ld(&mm, &p_command, &p_result, &p_error); if(argc>1) { // read from script before going interactive std::ifstream ff(argv[1]); ld.accept_commands_old(ff); ff.close(); } ld.print_prompt(); try { mm.run(1); } catch(std::exception& ex) { std::cerr << ex.what() << std::endl; } } return 0; } modglue-1.8/src/modwrap.cc0000600000077000007700000000766507213767241015164 0ustar kantorkantor #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int sig_chld_pipe[2]; pid_t childpid_; void sig_kill(int signo) { // This does of course not catch SIGKILL, that will still leave // process adopted by init. But there is no way around that, apparently. kill(childpid_, SIGTERM); exit(-1); } void sig_chld(int signo) { int status; pid_t childpid; if((childpid=waitpid(-1, &status, WNOHANG)) < 0) { throw logic_error("waitpid failed"); } if(WIFEXITED(status)) { int child_val = WEXITSTATUS(status); write(sig_chld_pipe[1],&child_val,1); } else if(WIFSIGNALED(status)) { int child_sig = WTERMSIG(status); int buf[1]; buf[0]=-1; write(sig_chld_pipe[1],buf,1); } } int main(int argc, char **argv) { if(argc==1) { cerr << "usage: modwrap [program] [options] ...." << endl << endl; cerr << "Creates a set of pseudo tty devices for stdin/stdout/stderr of" << endl << "the given program, and maps them to the corresponding pipes of" << endl << "the ptywrap program, thereby fooling the program to think that" << endl << "it is always connected to a pseudo tty." << endl << endl << "example: isatty out" << endl << " ptywrap isatty out" << endl << endl << "info: message identifier size = " << sizeof(modglue::mid) << endl; exit(1); } pair p_stdin =open_pty_master(); pair p_stdout=open_pty_master(); pair p_stderr=open_pty_master(); if(pipe(sig_chld_pipe)!=0) throw logic_error("cannot create sig_chld_pipe"); struct sigaction act; act.sa_handler = sig_chld; sigemptyset(&act.sa_mask); act.sa_flags = SA_NOCLDSTOP; if(sigaction(SIGCHLD, &act, NULL) < 0) { throw logic_error("sigaction failed"); } act.sa_handler = sig_kill; sigemptyset(&act.sa_mask); if(sigaction(SIGTERM, &act, NULL) < 0) { throw logic_error("sigaction failed"); } switch(childpid_=fork()) { case -1: throw logic_error("cannot fork"); break; case 0: { dup2(open_pty_slave(p_stdin.second), 0); dup2(open_pty_slave(p_stdout.second),1); dup2(open_pty_slave(p_stderr.second),2); execvp(argv[1],&(argv[1])); } default: break; } fd_set rfds; fd_set efds; fcntl(0, F_SETFL, O_NONBLOCK); fcntl(p_stdout.first, F_SETFL, O_NONBLOCK); fcntl(p_stderr.first, F_SETFL, O_NONBLOCK); int retcode=0; char buffer[1024]; do { FD_ZERO(&rfds); FD_ZERO(&efds); FD_SET(sig_chld_pipe[0],&rfds); FD_SET(0, &rfds); FD_SET(0, &efds); FD_SET(p_stdout.first, &rfds); FD_SET(p_stdout.first, &efds); FD_SET(p_stderr.first, &rfds); FD_SET(p_stderr.first, &efds); int retval = select(max(sig_chld_pipe[0], max(p_stdout.first,p_stderr.first))+1, &rfds, NULL, &efds, NULL); if(FD_ISSET(sig_chld_pipe[0], &rfds)) { read(sig_chld_pipe[0],buffer,1); retcode=buffer[0]; break; } if(FD_ISSET(0,&rfds)) { int length=read(0,buffer,1023); if(length>0) { // FIXME: strip identifier from input channel and remember it. write(p_stdin.first,buffer,length); } } if(FD_ISSET(p_stdout.first,&rfds)) { int length=read(p_stdout.first,buffer,1023); if(length>0) { // FIXME: add identifier write(1,buffer,length); } } if(FD_ISSET(p_stderr.first,&rfds)) { int length=read(p_stderr.first,buffer,1023); if(length>0) { // FIXME: add identifier write(2,buffer,length); } } } while(1==1); if(retcode!=-1) { int length=0; while((length=read(p_stdout.first,buffer,1023))>0) { // FIXME: add identifier write(1,buffer,length); } while((length=read(p_stderr.first,buffer,1023))>0) { // FIXME: add identifier write(2,buffer,length); } } exit(retcode); } modglue-1.8/src/moving0000700000077000007700000000006507263377710014415 0ustar kantorkantor#!/bin/sh echo -n "to moving mode..." cat modglue-1.8/src/pipe.cc0000600000077000007700000001666410042224512014426 0ustar kantorkantor #include #include #include #include #include #include #include #include #include #include #include using namespace modglue; modglue::pipe::pipe(const std::string& name) : process(0), name_(name), fd_(-1), fd_external_(-1), first_read_after_select_(false), broken_(true), unix_style_pipe_(false), make_blocking_(false) { } modglue::pipe::~pipe() { close(); close_external(); } std::string modglue::pipe::name(void) const { return name_; } int modglue::pipe::fd(void) const { return fd_; } int modglue::pipe::fd_external(void) const { return fd_external_; } void modglue::pipe::set_unix_style(void) { unix_style_pipe_=true; } void modglue::pipe::set_blocking(void) { make_blocking_=true; } bool modglue::pipe::is_broken(void) const { return broken_; } void modglue::pipe::open(int fd, int fd_external) { if(fd_!=-1 || fd_external_!=-1) { throw std::logic_error("pipe already open"); } if(fd==-1 && fd_external==-1) { int socks[2]; if(socketpair(AF_UNIX, SOCK_STREAM, 0, socks)!=0) { throw std::logic_error("cannot open sockets"); } fd_=socks[0]; fd_external_=socks[1]; } else { fd_=fd; fd_external_=fd_external; } broken_=false; do_fcntl_(); } void modglue::pipe::close(void) { if(fd_!=-1) { ::close(fd_); fd_=-1; broken_=true; } } void modglue::pipe::close_external(void) { if(fd_external_!=-1) { ::close(fd_external_); fd_external_=-1; } } void modglue::pipe::first_read_after_select() { first_read_after_select_=true; } void modglue::pipe::send_with_ack(const char *txt, int length) { // FILE *fp=fopen("/tmp/send_with_ack","a"); if(/* fd_!=-1 && */ !broken_) { // fprintf(fp, "%s", txt); if(send_blocking_(txt, length)==false) { throw std::logic_error("modglue::pipe::send_with_ack: error writing data, " + std::string(strerror(errno))); } } // if(!unix_style_pipe_) { // std::string result; // if(read_blocking_(result, 5)==false || result!="OK") { // cerr << "error reading data on " << fd_ // << ", error " << errno << ", " << strerror(errno) << endl; // broken_=true; // } // cerr << "send ack received for " << fd_ << endl; // } // fclose(fp); } int modglue::pipe::read_with_ack(char *txt, int maxlen) { int ret=read_nonblocking_(txt, maxlen); // std::cerr << "read with ack on " << name_ << " " << ret; // if(ret<0) // std::cerr << " " << strerror(errno); // std::cerr << std::endl; // We cannot set the pipe to broken here, because somebody may // have called read without coming from a select (this is typically // what happens when doing 'while(p>>var)' inside a callback). // A pipe is set to broken when the associated process dies, or // when the acknowledgement fails to come back (the latter has not // yet been implemented, have to think first). if(ret==0 && first_read_after_select_) { broken_=true; } first_read_after_select_=false; // if(!unix_style_pipe_) // if(ret>0) // send_blocking_("OK", 2); if(ret==0) return -1; return ret; } int modglue::pipe::read_nonblocking_(char *data, int maxlen) { if(fd_==-1 || broken_) { return -1; } if(1==1 /* unix_style_pipe_*/ ) { int ret; do { ret=read(fd_, data, maxlen); } while(ret<0 && errno==EINTR); return ret; } else { // CHECKED: recmsg is not the reason for dropped bytes char cbuf[CMSG_SPACE(sizeof(int))]; struct msghdr mh = {0}; struct iovec iov; mh.msg_iov = &iov; mh.msg_iovlen = 1; iov.iov_base = data; iov.iov_len = maxlen; mh.msg_control = cbuf; mh.msg_controllen = sizeof cbuf; int ret; do { ret = recvmsg(fd_, &mh, 0); } while(ret<0 && errno==EINTR); assert(!(ret<0 && errno!=EAGAIN)); return ret; } } int modglue::pipe::send_blocking_(const char *data, int length) { assert(data); assert(length>0); if(fd_==-1 || broken_) return false; if(1==1 /*unix_style_pipe_*/) { if(length>0) { // write fails on large blocks. unsigned int len=0; while(len0) len+=ret; } } return length; } else { // CHECKED: sendmsg is not the reason for dropped bytes struct iovec iov[1]; struct msghdr msg; struct { struct cmsghdr cm; int fd; } cmsg; memset( &msg, 0, sizeof(msg) ); memset( &cmsg, 0, sizeof(cmsg) ); msg.msg_control=0; msg.msg_controllen=0; msg.msg_iov = iov; /* msg header */ msg.msg_iovlen = 1; msg.msg_name = 0; iov[0].iov_base = (void *)data; iov[0].iov_len = length; int bytes_sent; if((bytes_sent=sendmsg(fd_,&msg,0))==-1) { throw std::logic_error("modglue::pipe::send_blocking_: sendmsg error " + std::string(strerror(errno))); } assert((unsigned int)bytes_sent==length); // std::cerr << "send " << bytes_sent << std::endl; return bytes_sent; } } /* Pipebuf */ pipebuf::pipebuf(pipe *p) : pipe_(p) { setg(i_buf + putbackarea, i_buf + putbackarea, i_buf + putbackarea); setp(o_buf, o_buf + bufsiz - 1); } pipebuf::~pipebuf() { sync(); } int pipebuf::underflow(void) { //still before end of buffer? if (gptr() < egptr()) { return *gptr(); } int numPutback = gptr() - eback(); if (numPutback > putbackarea) { numPutback = putbackarea; } //copy characters into put back area. memcpy(i_buf + (putbackarea - numPutback), gptr() - numPutback, numPutback); //read new characters int num; // CHECKED: the total 'num' gives the correct number of characters, so we // do read everything in (when things come from a unix pipe). num = pipe_->read_with_ack(i_buf+putbackarea, bufsiz-putbackarea); if (num <= 0) return EOF; // std::cerr << "read " << num << std::endl; // setg(eback, gptr, egptr) setg(i_buf + (putbackarea - numPutback), i_buf + putbackarea, i_buf + putbackarea + num); //return next character return *gptr(); } int pipebuf::sync(void) { if(flushbuffer()==EOF) return -1; else return 0; } int pipebuf::overflow(int ch) { if (ch != EOF) { *pptr() = ch; pbump(1); } if(flushbuffer()==EOF) return EOF; else return ch; } int pipebuf::flushbuffer(void) { int length = pptr() - pbase(); if (length > 0) { pipe_->send_with_ack(o_buf, length); pbump(-length); } return length; } /* Output pipe */ modglue::opipe::opipe(const std::string& name) : pipe(name), std::ostream(new pipebuf(this)) { } void modglue::opipe::do_fcntl_(void) const { // FIXME: the problem is that this is not inherited. The // blocking flag does something funny on both sides. You have // to first fork, and then set the fd blocking, before execing // the child process. // // Done here, it does not do anything. // if(make_blocking_) // fcntl(fd_, F_SETFL, 0); } /* Input pipe */ modglue::ipipe::ipipe(const std::string& name) : pipe(name), std::istream(new pipebuf(this)) { } void modglue::ipipe::do_fcntl_(void) const { // FIXME: MAIN MYSTERY: setting fd 0 to NONBLOCK leads to // loss of _output_ on std::cout and std::cerr. I don't get it. // Can we live without this NONBLOCK? if(fd_!=0) fcntl(fd_, F_SETFL, O_NONBLOCK); } modglue-1.8/src/process.cc0000600000077000007700000001054510566301726015155 0ustar kantorkantor #include #include #include #include #include #include #include #include #include using namespace modglue; child_process::fd_pair::fd_pair(int fd, direction_t dir) : child_fd(fd), parent_fd(-1), direction(dir) { } child_process::child_process(const std::string& nm) : name(nm), pid_(0) { } child_process::child_process(const std::string& nm, const std::vector& ar) : name(nm), args(ar), pid_(0) { } child_process::~child_process() { close(); if(pid_ > 0) kill(pid_, SIGTERM); } child_process& child_process::operator<<(const std::string& st) { args.push_back(st); return (*this); } void child_process::standard_pipes() { assert(pid_==0); // cannot be called after program has been forked pipes.clear(); pipes.push_back(fd_pair(0,fd_pair::child_input)); pipes.push_back(fd_pair(1,fd_pair::child_output)); pipes.push_back(fd_pair(2,fd_pair::child_output)); } void child_process::call(const std::string& inp, std::string& outp) { std::string outerr; call(inp, outp, outerr); } void child_process::call(const std::string& inp, std::string& outp, std::string& outerr) { standard_pipes(); fork(); // FIXME: for very long input std::strings, this leads to failure. if(inp.size()>0) ::write(pipes[0].parent_fd, inp.c_str(), inp.size()); char buffer[1024]; int pos; stdoutagain: while((pos=::read(pipes[1].parent_fd, buffer, 1023))>0) { buffer[pos]=0; outp+=buffer; } if(pos<0 && errno==EINTR) goto stdoutagain; stderragain: while((pos=::read(pipes[2].parent_fd, buffer, 1023))>0) { buffer[pos]=0; outerr+=buffer; } if(pos<0 && errno==EINTR) goto stderragain; close(); terminate(); } void child_process::terminate() { if(pid_ > 0) { kill(pid_, SIGTERM); pid_=0; } } void child_process::wait() { if(pid_ > 0) { waitpid(pid_, 0, 0); pid_=0; } } void child_process::write(const std::string& str) { ::write(pipes[0].parent_fd, str.c_str(), str.size()); } void child_process::read(std::string& str) { int pos=0; char buffer[2]; while((pos=::read(pipes[1].parent_fd, buffer, 1))>0) { if(buffer[0]=='\n') break; str+=buffer[0]; } } ssize_t child_process::read(void *buffer, size_t len) { return ::read(pipes[1].parent_fd, buffer, len); } ssize_t child_process::write(void *buffer, size_t len) { return ::write(pipes[0].parent_fd, buffer, len); } void child_process::fork() { if(pipes.size()==0) standard_pipes(); const char *cargs[args.size()+2]; cargs[0]=name.c_str(); for(unsigned int i=0; i(cargs)); throw std::logic_error("modglue::child_process::fork: execlp failed"); break; } default: // we are the parent for(unsigned int i=0; i This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* We use some non-standard escape codes: ESC $ [text] $ : fill the edit buffer with [text] */ #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; struct termios saved_attributes, raw_attributes; modglue::main *cmm; modglue::opipe *t_stdin; modglue::ipipe s_stdin("s_stdin"); modglue::opipe s_stdout("s_stdout"); modglue::opipe s_stderr("s_stderr"); pid_t thepid; bool go_to_sleep=false; enum state_t { initial, escape_read, movement_escape_read, eat_one_char } state; string combine, last_output_line; vector history; unsigned int hispos=0; bool moving=false; unsigned int pos=0; void sigc_handler(int num) { kill(thepid, SIGINT); signal(SIGINT,sigc_handler); } void raw_terminal(void); void buffered_terminal(void); void redraw_line(const string& str, unsigned int curpos, unsigned int nextpos); void sigstp_handler(int num) { signal(SIGTSTP,&sigstp_handler); //go_to_sleep=true; tcsetattr(0, TCSANOW, &saved_attributes); kill(getpid(),SIGSTOP); } void sigcont_handler(int num) { signal(SIGCONT,&sigcont_handler); tcsetattr(0, TCSANOW, &raw_attributes); fcntl(0, F_SETFL, O_NONBLOCK); s_stdout << last_output_line << std::flush; redraw_line(combine, 0, pos); } void buffered_terminal(void) { tcsetattr(0, TCSANOW, &saved_attributes); } void raw_terminal(void) { tcgetattr(0, &saved_attributes); atexit(buffered_terminal); tcgetattr(0, &raw_attributes); raw_attributes.c_lflag &= ~(ICANON|ECHO); tcsetattr(0, TCSANOW, &raw_attributes); signal(SIGTSTP,&sigstp_handler); signal(SIGCONT,&sigcont_handler); } // void save_cursor() // { // cout << "\033[s"; // } // // void restore_cursor() // { // cout << "\033[u"; // } void erase_line() { s_stdout << "\033[K"; } void move_left(unsigned int num=1) { if(num>0) s_stdout << "\033[" << num << "D" << flush; } void move_right(unsigned int num=1) { if(num>0) s_stdout << "\033[" << num << "C" << flush; } void redraw_line(const string& str, unsigned int curpos, unsigned int nextpos) { move_left(curpos); erase_line(); s_stdout << str << flush; move_left(str.size()-nextpos); } bool died(modglue::ext_process& pr) { // s_stderr << "********process " << pr.name() << " died" << endl; return true; } void process_stdin(const char *buffer, int len) { for(int curchar=0; curchar0) { combine=(pos>1?combine.substr(0,pos-1):"")+ (pos0) { if(hispos+1==history.size()) { history.pop_back(); history.push_back(combine); } combine=history[--hispos]; redraw_line(combine, pos, combine.size()); pos=combine.size(); } } state=initial; break; case 'B': if(moving) { (*t_stdin) << "\\down" << endl; } else { if(hispos+10) { --pos; move_left(); } } state=initial; break; default: state=initial; break; } break; } } } bool receive_stdout(modglue::ipipe& p) { char buffer[1024]; int len; enum write_t { w_normal, w_fill }; static write_t wmode=w_normal; do { p.read(buffer,1023); len=p.gcount(); if(len>0) { buffer[len]=0; if(len>=3) { if(strncmp("\033[u", &(buffer[len-3]), 3)==0) moving=true; } for(unsigned int i=0; idebugout << buffer[i]; s_stdout << buffer[i]; if(buffer[i]=='\n') last_output_line.clear(); else last_output_line+=buffer[i]; } break; case w_fill: if(buffer[i]=='$') { wmode=w_normal; redraw_line(combine, pos, pos-1); } else combine+=buffer[i]; break; } } s_stdout << flush; } } while(len>0); p.clear(); return true; } bool receive_stdin(modglue::ipipe& p) { char buffer[1024]; int len; do { p.read(buffer,1016); len=p.gcount(); if(len>0) process_stdin(buffer, len); } while(len>0); p.clear(); return true; } bool receive_stderr(modglue::ipipe& p) { char buffer[1024]; int len; do { p.read(buffer,1016); len=p.gcount(); if(len>0) s_stderr << buffer << flush; } while(len>0); p.clear(); return true; } int main(int argc, char **argv) { if(argc==1) { cerr << "prompt ("; #ifdef STATICBUILD cerr << "static, "; #endif cerr << "built on " << DATETIME << /* " on " << HOSTNAME << */ ")" << std::endl << "Copyright (C) 2001-2006 Kasper Peeters " << endl << endl << "Usage: prompt [program] [args]" << endl; exit(-1); } if(!isatty(0)) { cerr << "prompt: stdin is not a tty." << endl; exit(-2); } modglue::main mm(argc, argv); mm.add(&s_stdin, 0); mm.add(&s_stdout, 1); mm.add(&s_stderr, 2); cmm=&mm; fcntl(0, F_SETFL, O_NONBLOCK); if(mm.check()) { int start=1; string program(argv[start]); modglue::ext_process proc(program); for(int i=start+1; ireceiver.connect(sigc::ptr_fun(receive_stdout)); proc.input_pipe("stderr")->receiver.connect(sigc::ptr_fun(receive_stderr)); t_stdin=proc.output_pipe("stdin"); mm.process_died.connect(sigc::ptr_fun(died)); history.push_back(""); raw_terminal(); mm.run(2); } catch(exception& ex) { cerr << ex.what() << endl; return -1; } s_stdout << std::flush; tcsetattr(0, TCSANOW, &saved_attributes); return 0; } else return -2; } modglue-1.8/src/ptywrap.cc0000600000077000007700000001773110573032540015202 0ustar kantorkantor/* The misfeature is the lack of an end-to-end flush operation in Unix. What stdio SHOULD do is to call one after every line of terminal input, pipe-like programs should honour it and pass it on, and output programs should honour it (and reflect it, if they are duplex). All good 1960s technology. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if USE_UTIL_H == 1 #include #else #include #endif #include #include // std::pair open_pty_master(void) // { // unsigned char ptychar='p'; // struct stat statbuff; // static char hexdigit[]="0123456789abcdef"; // int master_fd=0; // // do { // for(unsigned char num=0; num<16; ++num) { // std::stringstream st; // st << "/dev/pty" << ptychar << hexdigit[num] << std::ends; // std::string ptyname=st.str(); // if(stat(ptyname.c_str(), &statbuff)<0) // break; // if((master_fd=open(ptyname.c_str(), O_RDWR))>=0) { // std::string ttyname=ptyname; // ttyname[5]='t'; // int tmp; // if((tmp=open(ttyname.c_str(), O_RDWR))>=0) { // close(tmp); // return std::pair(master_fd, ptyname); // } // else { // close(master_fd); // some systems have incorrect permissions on some /dev/ttyp // } // } // } // ++ptychar; // } while(ptychar!='z'); // throw std::logic_error("cannot open pseudo-tty in master mode"); // return std::pair(-1,""); // } // // int open_pty_slave(std::string ptyname) // { // int slave_fd; // ptyname[5]='t'; // slave_fd=open(ptyname.c_str(), O_RDWR); // if(slave_fd<0) { // std::cerr << "slave open for " << ptyname << " failed: " << strerror(errno) << std::endl; // } // assert(slave_fd>=0); // // // struct termio temp_mode; // // if(ioctl(slave_fd, TCGETA, &temp_mode)<0) // // throw std::logic_error("cannot get tty mode"); // // // // temp_mode.c_iflag = 0; // // temp_mode.c_oflag &= ~OPOST; // // temp_mode.c_lflag &= ~(ISIG | ICANON | ECHO | XCASE); // // temp_mode.c_cflag &= ~(CSIZE | PARENB); // // temp_mode.c_cflag |= CS8; // // temp_mode.c_cc[VMIN]=1; // // temp_mode.c_cc[VTIME]=1; // // // // if(ioctl(slave_fd, TCSETA, &temp_mode)<0) // // throw std::logic_error("cannot set tty mode to raw"); // // struct termios temp_mode; // if(tcgetattr(slave_fd, &temp_mode)<0) // throw std::logic_error("cannot get tty mode"); // // temp_mode.c_iflag = 0; // temp_mode.c_oflag &= ~OPOST; // temp_mode.c_lflag &= ~(ISIG | ICANON | ECHO); // | XCASE); // temp_mode.c_cflag &= ~(CSIZE | PARENB); // temp_mode.c_cflag |= CS8; // temp_mode.c_cc[VMIN]=1; // temp_mode.c_cc[VTIME]=1; // // if(tcsetattr(slave_fd, TCSANOW, &temp_mode)<0) // throw std::logic_error("cannot set tty mode to raw"); // // // return slave_fd; // } int open_pty_slave(int slave_fd) { struct termios temp_mode; if(tcgetattr(slave_fd, &temp_mode)<0) throw std::logic_error("cannot get tty mode"); temp_mode.c_iflag = 0; temp_mode.c_oflag &= ~OPOST; temp_mode.c_lflag &= ~(ISIG | ICANON | ECHO); // | XCASE); temp_mode.c_cflag &= ~(CSIZE | PARENB); temp_mode.c_cflag |= CS8; temp_mode.c_cc[VMIN]=1; temp_mode.c_cc[VTIME]=1; if(tcsetattr(slave_fd, TCSANOW, &temp_mode)<0) throw std::logic_error("cannot set tty mode to raw"); return slave_fd; } int sig_chld_pipe[2]; pid_t childpid_; void sig_kill(int signo) { // This does of course not catch SIGKILL, that will still leave // process adopted by init. But there is no way around that, apparently. kill(childpid_, SIGTERM); exit(-1); } void sig_chld(int signo) { int status; pid_t childpid; if((childpid=waitpid(-1, &status, WNOHANG)) < 0) { throw std::logic_error("waitpid failed"); } if(WIFEXITED(status)) { int child_val = WEXITSTATUS(status); write(sig_chld_pipe[1],&child_val,1); } else if(WIFSIGNALED(status)) { int child_sig = WTERMSIG(status); int buf[1]; buf[0]=-1; write(sig_chld_pipe[1],buf,1); } } int main(int argc, char **argv) { if(argc==1) { std::cerr << "usage: ptywrap [program] [options] ...." << std::endl << std::endl; std::cerr << "Creates a set of pseudo tty devices for stdin/stdout/stderr of" << std::endl << "the given program, and maps them to the corresponding pipes of" << std::endl << "the ptywrap program, thereby fooling the program to think that" << std::endl << "it is always connected to a pseudo tty." << std::endl << std::endl << "example: isatty out" << std::endl << " ptywrap isatty out" << std::endl << std::endl << "info: message identifier size = " << sizeof(modglue::mid) << std::endl; exit(1); } std::pair p_stdin, p_stdout, p_stderr; openpty(&p_stdin.first, &p_stdin.second, 0, 0, 0); openpty(&p_stdout.first, &p_stdout.second, 0, 0, 0); openpty(&p_stderr.first, &p_stderr.second, 0, 0, 0); if(pipe(sig_chld_pipe)!=0) throw std::logic_error("cannot create sig_chld_pipe"); struct sigaction act; act.sa_handler = sig_chld; sigemptyset(&act.sa_mask); act.sa_flags = SA_NOCLDSTOP | SA_RESTART; if(sigaction(SIGCHLD, &act, NULL) < 0) { throw std::logic_error("sigaction failed"); } act.sa_handler = sig_kill; sigemptyset(&act.sa_mask); if(sigaction(SIGTERM, &act, NULL) < 0) { throw std::logic_error("sigaction failed"); } act.sa_handler = sig_kill; sigemptyset(&act.sa_mask); if(sigaction(SIGINT, &act, NULL) < 0) { throw std::logic_error("sigaction failed"); } switch(childpid_=fork()) { case -1: throw std::logic_error("cannot fork"); break; case 0: { // close parent side of the pipe close(p_stdin.first); close(p_stdout.first); close(p_stderr.first); // dup the default streams and then close the originals open_pty_slave(p_stdin.second); open_pty_slave(p_stdout.second); open_pty_slave(p_stderr.second); dup2(p_stdin.second,0); dup2(p_stdout.second,1); dup2(p_stderr.second,2); close(p_stdin.second); close(p_stdout.second); close(p_stderr.second); write(sig_chld_pipe[1], "G", 1); // exec the actual program execvp(argv[1],&(argv[1])); } default: break; } fd_set rfds; fd_set efds; fcntl(0, F_SETFL, O_NONBLOCK); fcntl(p_stdout.first, F_SETFL, O_NONBLOCK); fcntl(p_stderr.first, F_SETFL, O_NONBLOCK); int retcode=0; char buffer[1024]; read(sig_chld_pipe[0], buffer, 1); // wait until child is ready do { FD_ZERO(&rfds); FD_ZERO(&efds); FD_SET(sig_chld_pipe[0],&rfds); FD_SET(0, &rfds); FD_SET(0, &efds); FD_SET(p_stdout.first, &rfds); FD_SET(p_stdout.first, &efds); FD_SET(p_stderr.first, &rfds); FD_SET(p_stderr.first, &efds); int retval = select(std::max(sig_chld_pipe[0], std::max(p_stdout.first,p_stderr.first))+1, &rfds, NULL, &efds, NULL); if(FD_ISSET(sig_chld_pipe[0], &rfds)) { read(sig_chld_pipe[0],buffer,1); retcode=buffer[0]; break; } if(FD_ISSET(0,&rfds)) { int length=read(0,buffer,1023); if(length>0) { // FIXME: strip identifier from input channel and remember it. if(write(p_stdin.first,buffer,length)==-1) break; } } if(FD_ISSET(p_stdout.first,&rfds)) { int length=read(p_stdout.first,buffer,1023); if(length>0) { // FIXME: add identifier if(write(1,buffer,length)==-1) break; } else break; } if(FD_ISSET(p_stderr.first,&rfds)) { int length=read(p_stderr.first,buffer,1023); if(length>0) { // FIXME: add identifier if(write(2,buffer,length)==-1) break; } else break; } } while(1==1); if(retcode!=-1) { int length=0; while((length=read(p_stdout.first,buffer,1023))>0) { // FIXME: add identifier write(1,buffer,length); } while((length=read(p_stderr.first,buffer,1023))>0) { // FIXME: add identifier write(2,buffer,length); } } exit(retcode); } modglue-1.8/src/shell.cc0000600000077000007700000002372607337262330014612 0ustar kantorkantor #include #include #include #include #include #include #include #include #include #include #include using namespace modglue; process_info::process_info(const std::string& name, const std::string& unique_name) : process(name), start_on_input(false), restart_after_exit(false), abort_on_failed_write(false), remove_after_exit(false), unique_name_(unique_name) { } // -------------- bond::bond(const std::string& nm) : name(nm) { } // -------------- void loader::print_prompt(void) { (*p_result) << ">" << std::flush; } void loader::print_jobs_(std::ostream& ss) { ss << "process list: (" << processes_.size() << " entries)" << std::endl; for(unsigned int i=0; iprocess.name(); if(processes_[i]->process.get_pid()==0) ss << " (standby)" << std::endl; else ss << " (running)" << std::endl; for(unsigned int j=0; jprocess.input_pipes().size(); ++j) { ss << " " << processes_[i]->process.name() << "::" << processes_[i]->process.input_pipes()[j] << std::endl; } for(unsigned int j=0; jprocess.output_pipes().size(); ++j) { ss << " " << processes_[i]->process.name() << "::" << processes_[i]->process.output_pipes()[j] << std::endl; } } } void loader::print_bonds_(std::ostream& ss) { for(unsigned int i=0; iname << ": " ; bond::iterator it=bonds_[i]->pipes.begin(); while(it!=bonds_[i]->pipes.end()) { // ss << (*it).first->get_name() << "::" // << (*it).first->pipes[(*it).second]->get_name() << " "; ++it; } ss << std::endl; } } bool loader::parse_(modglue::ipipe& p) { char c; while(p.get(c)) { switch(status_.back()) { case s_skipwhite: if(!isspace(c)) { p.unget(); status_.pop_back(); } break; case s_initial: assert(!isspace(c)); if(c=='|' || c=='^' || c=='&') { errors_.push_back("illegal character at begin of input"); return false; } else { status_.pop_back(); status_.push_back(s_skipwhite); status_.push_back(s_scan); p.unget(); break; } break; case s_scan: if(c=='{') { ingroup_=true; status_.push_back(s_groupscan); status_.push_back(s_skipwhite); break; } else { status_.push_back(s_command); p.unget(); } break; case s_groupscan: break; case s_command: if(c=='}') { if(!ingroup_) { errors_.push_back("encountered superfluous '}' character"); return false; } else { ingroup_=false; break; } } else if(isspace(c)) { status_.push_back(s_skipwhite); status_.push_back(s_arg_or_control); new_processes_.push_back(new process_info(current_, current_)); current_=""; break; } else if(c=='|' || c=='^' || c=='&') { p.unget(); status_.push_back(s_arg_or_control); new_processes_.push_back(new process_info(current_, current_)); current_=""; break; } else current_+=c; break; case s_arg_or_control: if(c=='>') { } if(c=='<') { } if(c=='&') { } if(c=='^') { } if(c=='|' || c=='^' || c=='&') { } break; } } p.clear(); return true; } /* Process connections (multiple pipes can be connected as one using the grouping symbols): viewer & ftp & cat "open ftp.somewhere.net\n" | ftp::stdin cat "binary\n get file -\n" | ftp::stdin { ftp::stdout, ftp::stderr } | viewer::stdin Pipe options (always written using a dot immediately following the pipe symbol; multiple options can be given by separating them with dots): ls ::stdout > out.txt |.discard (default) ls ::stdout > out.txt ::stderr |.keep Making connections and then starting (curly brackets denote grouping and lead, in the second case, to start of both processes before any other activities take place): { ls, grep } ^ ls::stdout | grep::stdin { ls, grep } @ Identical programs with different names: { ls:binls /bin, ls:tmpls /tmp } ^ binls::stdout | ::stdin grep file & tmpls::stdout | ::stdin grep dir & { binls, tmpls } @ Alternatively, use the automatically generated names (but beware that the numbers can change if you had other processes with the same name running already; see 'jobs' for the real names): { ls /bin, ls /tmp } ^ ls::stdout | ::stdin grep file & ls<2>::stdout | ::stdin grep dir & { ls, ls<2> } @ ::pipe refers to the pipe of the current program; a pipe symbol starts a new program group. If pipes are omitted, the default settings are used. These are searched from top to bottom, and search stops as soon as a match is found. default ::stdout | ::stdin default ::stdin | ::stdout default ::* |.discard ls > txt.out (behaves as usual) Curly braces group either processes or pipes, but not a combination. They can also not be used to group entire commands (ie. like round brackets do in sh). Curly braces cannot be nested. LOOK AT: http://www.holoweb.net/~simpl/ */ bool loader::accept_commands_old(std::istream& p) { return true; } bool loader::accept_commands(modglue::ipipe& p) { if(parse_(p)==false) { p.ignore(MAXINT); } if(errors_.size()>0) { for(unsigned int i=0; i0) { for(unsigned int i=0; iprocess.name() << std::endl; } } print_prompt(); return true; } loader::loader(modglue::main *mn, modglue::ipipe *p_c, modglue::opipe *p_r, modglue::opipe *p_e) : ingroup_(false), main_(mn), p_command(p_c), p_result(p_r), p_error(p_e) { status_.push_back(s_initial); status_.push_back(s_skipwhite); p_command->receiver.connect(SigC::slot(*this, &modglue::loader::accept_commands)); } void loader::quit(void) { } loader::~loader() { for(unsigned int i=0; ipipes.begin(); // while(mit!=bonds_[i]->pipes.end()) { // if((*mit).first==proc) { // set >::iterator it=bonds_[i]->pipes.begin(); // while(it!=bonds_[i]->pipes.end()) { // if(it!=mit) { // if((*it).first->pipes[(*it).second]->get_inout()==pipeinfo::input && // !((*it).first->pipes[(*it).second]->get_unix_style()) ) { // int totalwriters=0; // pair scanfor=(*it); // for(unsigned int k=0; kpipes.count(scanfor)>0) { // set >::iterator wr=bonds_[k]->pipes.begin(); // while(wr!=bonds_[k]->pipes.end()) { // if((*wr).first->get_pid()!=0 && // (*wr).first->pipes[(*wr).second]->get_inout()==pipeinfo::output) { // ++totalwriters; // } // ++wr; // } // } // } // if(totalwriters==0) { // write((*it).first->pipes[(*it).second]->get_fd(),"\004",1); // } // } // } // ++it; // } // } // ++mit; // } // } void loader::add_bond_(bond *b) { bonds_.push_back(b); } void loader::remove_bond_(bond *b) { std::vector::iterator it=bonds_.begin(); while(it!=bonds_.end()) { if((*it)==b) { bonds_.erase(it); return; } ++it; } assert(1==0); } /* pair loader::str2pipe(const string& str) { pair ret; ret.first=0; ret.second=-1; string::size_type loc=str.find("::"); if(locget_name()==procname) { ret.first=processes_[i]; break; } } if(ret.first) { for(unsigned int i=0; ipipes.size(); ++i) { if(ret.first->pipes[i]->get_name()==pipename) { ret.second=i; break; } } } } return ret; } vector args; // Setup a process entry and the associated loader pipes for the modshell // process, so that we don't have to use special cases for forwarding // to/from modshell pipes. // NOTE: the direction is a bit funny, because we should view this from // the point of view of someone connecting _to_ modshell. So stdout is input. modglue::process *proc=new modglue::process("_loader",args); loader_pipe *lp1=new loader_pipe(main_->pipes()[0]->get_name(), modglue::pipeinfo::output); lp1->set_fd(main_->pipes()[0]->get_fd()); lp1->set_unix_style(); // FIXME: this will make things fail when modshell is started from modshell. proc->pipes.push_back(lp1); loader_pipe *lp2=new loader_pipe(main_->pipes()[1]->get_name(), modglue::pipeinfo::input); lp2->set_fd(main_->pipes()[1]->get_fd()); lp2->set_unix_style(); proc->pipes.push_back(lp2); loader_pipe *lp3=new loader_pipe(main_->pipes()[2]->get_name(), modglue::pipeinfo::input); lp3->set_fd(main_->pipes()[2]->get_fd()); lp3->set_unix_style(); proc->pipes.push_back(lp3); proc->childpid_=getpid(); processes_.push_back(proc); fd_to_pipe_[lp1->get_fd()]=pair(proc,0); fd_to_pipe_[lp2->get_fd()]=pair(proc,1); fd_to_pipe_[lp3->get_fd()]=pair(proc,2); */ modglue-1.8/src/test_child_process.cc0000600000077000007700000000146310042224162017341 0ustar kantorkantor #include #include #include #include using namespace std; int main(int argc, char **argv) { string result; modglue::child_process ls_proc("ls"); ls_proc << "-la" << "/tmp"; ls_proc.call("", result); std::cout << "result of ls call: |" << result << "|" << std::endl; // like libexecstream: http://libexecstream.sourceforge.net/ modglue::ext_process cat_proc("cat"); cat_proc.setup_pipes(); cat_proc.output_pipe("stdin")->set_blocking(); cat_proc.fork(); std::cout << cat_proc.output_pipe("stdin")->fd() << std::endl; *(cat_proc.output_pipe("stdin")) << "hi there" << std::endl; while(std::getline(*(cat_proc.input_pipe("stdout")), result)) { std::cout << "received: |" << result << "|" << std::endl; } cat_proc.terminate(); } modglue-1.8/src/test_ext_process.cc0000600000077000007700000000260210403767112017062 0ustar kantorkantor #include #include #include #include #include using namespace std; modglue::ext_process ls_proc("ls"); modglue::ext_process mi_proc("examples/multi_io"); bool print(modglue::ipipe& p) { string str; while(getline(p,str)) { cerr << "from ls: |" << str << "|" << endl; // cerr << "forwarding to " // << mi_proc.output_pipe("foo")->name() << " " // << mi_proc.output_pipe("foo")->fd() << endl; *(mi_proc.output_pipe("foo")) << str << endl << flush; } p.clear(); return true; } bool printmio(modglue::ipipe& p) { string str; while(getline(p,str)) { cerr << "from mi: |" << str << "|" << endl; } p.clear(); return true; } int counter=1; bool died(modglue::ext_process& pr) { cerr << "********process " << pr.name() << " died" << endl; if(counter<2) { ++counter; pr.fork(); return false; } return true; } int main(int argc, char **argv) { modglue::main mm(argc, argv); try { ls_proc.setup_pipes(); mi_proc.setup_pipes(); mm.add(&ls_proc); mm.add(&mi_proc); ls_proc.input_pipe("stdout")->receiver.connect(sigc::ptr_fun(print)); mi_proc.input_pipe("bar")->receiver.connect(sigc::ptr_fun(printmio)); mm.process_died.connect(sigc::ptr_fun(died)); ls_proc.fork(); mi_proc.fork(); mm.run(0); } catch(exception& ex) { cerr << ex.what() << endl; } } modglue-1.8/src/test_pipe.cc0000600000077000007700000000111310403767054015462 0ustar kantorkantor #include #include using namespace std; modglue::ipipe ip("input"); modglue::opipe op("input"); bool inp(modglue::ipipe& p) { string kasper; while(p>>kasper) { op << "received: " << kasper << endl; } p.clear(); op << "--" << endl; return true; } int main(int argc, char **argv) { /* modglue::main::init(argc, argv); */ modglue::main mm(argc, argv); mm.add(&ip,0); mm.add(&op,1); if(mm.check()) { ip.receiver.connect(sigc::ptr_fun(inp)); mm.run(1); } // Also test that creation of pipes does not leak memory. } modglue-1.8/src/test_pipe_gtk.cc0000600000077000007700000000125107327254757016346 0ustar kantorkantor /* This is the same program as test_pipe.cc, but now using an external event loop (for this particular example, we use the Gtk event loop). */ #include #include modglue::ipipe ip("input"); modglue::opipe op("input"); bool inp(modglue::ipipe& p) { string kasper; while(p>>kasper) { op << "received: " << kasper << endl; } p.clear(); op << "--" << endl; return true; } int main(int argc, char **argv) { // Gtk::Main modglue::main mm(argc, argv); mm.add(&ip,0); mm.add(&op,1); if(mm.check()) { ip.receiver.connect(SigC::slot(inp)); mm.run(); } // Also test that creation of pipes does not leak memory. } modglue-1.8/src/test_writes.cc0000600000077000007700000000241510403767130016043 0ustar kantorkantor #include #include #include using namespace std; modglue::ipipe ip("stdin"); modglue::opipe op("stdout"); modglue::opipe op2("stderr"); std::ofstream out("test_writes.out"); bool inp(modglue::ipipe& p) { static bool done=false; if(!done) { std::ifstream inp("out"); char buffer[2024]; int num; for(;;) { inp.read(buffer, 2023); num=inp.gcount(); if(num>0) { op.write(buffer,num); } else break; } op << std::flush; done=true; } /* char buffer[1024]; streamsize num; for(;;) { p.read(buffer,1016); // CHECKED: if we do it this way, all characters get received num=p.gcount(); if(num>0) { std::cerr << "recv " << num << std::endl; op.write(buffer, num); out.write(buffer, num); // cerr.write(buffer, num); } else break; } p.clear(); return true; std::string lng; for(unsigned int i=0; i<500; ++i) lng+="testing 1 2 3 4 5 "; for(;;) { op << lng << std::endl; } p.clear(); */ return true; } int main(int argc, char **argv) { modglue::main mm(argc, argv); mm.add(&ip,0); mm.add(&op,1); mm.add(&op2,2); if(mm.check()) { ip.receiver.connect(sigc::ptr_fun(inp)); mm.run(1); } // IMPORTANT: remember to flush before closing. op << std::flush; }